From 4ede31105599d0af566f4143c85b35767f98b59f Mon Sep 17 00:00:00 2001 From: DrKLO Date: Sun, 23 Mar 2014 02:31:55 +0400 Subject: [PATCH] Update to 1.4.6 Audio notes (opus codec) A lot of different improvements and bug fixes Thanks to: https://github.com/DrKLO/Telegram/issues/293 https://github.com/DrKLO/Telegram/issues/256 FOSS configuration not ready yet I will move main dev branch to github in next couple commits --- TMessagesProj/build.gradle | 59 +- .../config/debug/AndroidManifest.xml | 50 + TMessagesProj/config/foss/AndroidManifest.xml | 16 + .../config/release/AndroidManifest.xml | 50 + TMessagesProj/jni/Android.mk | 169 +- TMessagesProj/jni/audio.c | 691 +++ TMessagesProj/jni/opus/celt/_kiss_fft_guts.h | 183 + TMessagesProj/jni/opus/celt/arch.h | 214 + TMessagesProj/jni/opus/celt/arm/arm2gnu.pl | 316 ++ .../jni/opus/celt/arm/arm_celt_map.c | 49 + TMessagesProj/jni/opus/celt/arm/armcpu.c | 174 + TMessagesProj/jni/opus/celt/arm/armcpu.h | 71 + TMessagesProj/jni/opus/celt/arm/armopts.s.in | 37 + .../jni/opus/celt/arm/celt_pitch_xcorr_arm.s | 545 ++ TMessagesProj/jni/opus/celt/arm/fixed_armv4.h | 76 + .../jni/opus/celt/arm/fixed_armv5e.h | 116 + .../jni/opus/celt/arm/kiss_fft_armv4.h | 121 + .../jni/opus/celt/arm/kiss_fft_armv5e.h | 118 + TMessagesProj/jni/opus/celt/arm/pitch_arm.h | 57 + TMessagesProj/jni/opus/celt/bands.c | 1518 ++++++ TMessagesProj/jni/opus/celt/bands.h | 114 + TMessagesProj/jni/opus/celt/celt.c | 223 + TMessagesProj/jni/opus/celt/celt.h | 218 + TMessagesProj/jni/opus/celt/celt_decoder.c | 1195 +++++ TMessagesProj/jni/opus/celt/celt_encoder.c | 2353 +++++++++ TMessagesProj/jni/opus/celt/celt_lpc.c | 309 ++ TMessagesProj/jni/opus/celt/celt_lpc.h | 54 + TMessagesProj/jni/opus/celt/cpu_support.h | 54 + TMessagesProj/jni/opus/celt/cwrs.c | 697 +++ TMessagesProj/jni/opus/celt/cwrs.h | 48 + TMessagesProj/jni/opus/celt/ecintrin.h | 87 + TMessagesProj/jni/opus/celt/entcode.c | 93 + TMessagesProj/jni/opus/celt/entcode.h | 117 + TMessagesProj/jni/opus/celt/entdec.c | 245 + TMessagesProj/jni/opus/celt/entdec.h | 100 + TMessagesProj/jni/opus/celt/entenc.c | 294 ++ TMessagesProj/jni/opus/celt/entenc.h | 110 + TMessagesProj/jni/opus/celt/fixed_debug.h | 773 +++ TMessagesProj/jni/opus/celt/fixed_generic.h | 134 + TMessagesProj/jni/opus/celt/float_cast.h | 140 + TMessagesProj/jni/opus/celt/kiss_fft.c | 719 +++ TMessagesProj/jni/opus/celt/kiss_fft.h | 139 + TMessagesProj/jni/opus/celt/laplace.c | 134 + TMessagesProj/jni/opus/celt/laplace.h | 48 + TMessagesProj/jni/opus/celt/mathops.c | 208 + TMessagesProj/jni/opus/celt/mathops.h | 258 + TMessagesProj/jni/opus/celt/mdct.c | 311 ++ TMessagesProj/jni/opus/celt/mdct.h | 70 + TMessagesProj/jni/opus/celt/mfrngcod.h | 48 + TMessagesProj/jni/opus/celt/modes.c | 438 ++ TMessagesProj/jni/opus/celt/modes.h | 83 + .../jni/opus/celt/opus_custom_demo.c | 210 + TMessagesProj/jni/opus/celt/os_support.h | 92 + TMessagesProj/jni/opus/celt/pitch.c | 537 ++ TMessagesProj/jni/opus/celt/pitch.h | 173 + TMessagesProj/jni/opus/celt/quant_bands.c | 556 +++ TMessagesProj/jni/opus/celt/quant_bands.h | 66 + TMessagesProj/jni/opus/celt/rate.c | 638 +++ TMessagesProj/jni/opus/celt/rate.h | 101 + TMessagesProj/jni/opus/celt/stack_alloc.h | 178 + .../jni/opus/celt/static_modes_fixed.h | 595 +++ .../jni/opus/celt/static_modes_float.h | 599 +++ TMessagesProj/jni/opus/celt/vq.c | 415 ++ TMessagesProj/jni/opus/celt/vq.h | 70 + TMessagesProj/jni/opus/celt/x86/pitch_sse.h | 156 + TMessagesProj/jni/opus/include/opus.h | 978 ++++ TMessagesProj/jni/opus/include/opus_custom.h | 342 ++ TMessagesProj/jni/opus/include/opus_defines.h | 726 +++ .../jni/opus/include/opus_multistream.h | 660 +++ TMessagesProj/jni/opus/include/opus_types.h | 159 + TMessagesProj/jni/opus/ogg/bitwise.c | 857 ++++ TMessagesProj/jni/opus/ogg/framing.c | 2111 ++++++++ TMessagesProj/jni/opus/ogg/ogg.h | 210 + TMessagesProj/jni/opus/ogg/os_types.h | 147 + TMessagesProj/jni/opus/opusfile/info.c | 683 +++ TMessagesProj/jni/opus/opusfile/internal.c | 42 + TMessagesProj/jni/opus/opusfile/internal.h | 249 + TMessagesProj/jni/opus/opusfile/opusfile.c | 3163 ++++++++++++ TMessagesProj/jni/opus/opusfile/opusfile.h | 2089 ++++++++ TMessagesProj/jni/opus/opusfile/stream.c | 366 ++ TMessagesProj/jni/opus/silk/A2NLSF.c | 252 + TMessagesProj/jni/opus/silk/API.h | 133 + TMessagesProj/jni/opus/silk/CNG.c | 172 + .../jni/opus/silk/HP_variable_cutoff.c | 77 + TMessagesProj/jni/opus/silk/Inlines.h | 188 + .../jni/opus/silk/LPC_analysis_filter.c | 106 + .../jni/opus/silk/LPC_inv_pred_gain.c | 154 + .../jni/opus/silk/LP_variable_cutoff.c | 135 + TMessagesProj/jni/opus/silk/MacroCount.h | 718 +++ TMessagesProj/jni/opus/silk/MacroDebug.h | 952 ++++ TMessagesProj/jni/opus/silk/NLSF2A.c | 178 + TMessagesProj/jni/opus/silk/NLSF_VQ.c | 68 + .../jni/opus/silk/NLSF_VQ_weights_laroia.c | 80 + TMessagesProj/jni/opus/silk/NLSF_decode.c | 101 + .../jni/opus/silk/NLSF_del_dec_quant.c | 207 + TMessagesProj/jni/opus/silk/NLSF_encode.c | 136 + TMessagesProj/jni/opus/silk/NLSF_stabilize.c | 142 + TMessagesProj/jni/opus/silk/NLSF_unpack.c | 55 + TMessagesProj/jni/opus/silk/NSQ.c | 446 ++ TMessagesProj/jni/opus/silk/NSQ_del_dec.c | 719 +++ TMessagesProj/jni/opus/silk/PLC.c | 423 ++ TMessagesProj/jni/opus/silk/PLC.h | 61 + TMessagesProj/jni/opus/silk/SigProc_FIX.h | 594 +++ TMessagesProj/jni/opus/silk/VAD.c | 357 ++ TMessagesProj/jni/opus/silk/VQ_WMat_EC.c | 120 + TMessagesProj/jni/opus/silk/ana_filt_bank_1.c | 74 + .../jni/opus/silk/arm/SigProc_FIX_armv4.h | 47 + .../jni/opus/silk/arm/SigProc_FIX_armv5e.h | 61 + .../jni/opus/silk/arm/macros_armv4.h | 103 + .../jni/opus/silk/arm/macros_armv5e.h | 213 + TMessagesProj/jni/opus/silk/biquad_alt.c | 78 + TMessagesProj/jni/opus/silk/bwexpander.c | 51 + TMessagesProj/jni/opus/silk/bwexpander_32.c | 50 + .../jni/opus/silk/check_control_input.c | 106 + TMessagesProj/jni/opus/silk/code_signs.c | 115 + TMessagesProj/jni/opus/silk/control.h | 142 + TMessagesProj/jni/opus/silk/control_SNR.c | 81 + .../jni/opus/silk/control_audio_bandwidth.c | 126 + TMessagesProj/jni/opus/silk/control_codec.c | 422 ++ TMessagesProj/jni/opus/silk/debug.c | 170 + TMessagesProj/jni/opus/silk/debug.h | 279 ++ TMessagesProj/jni/opus/silk/dec_API.c | 397 ++ TMessagesProj/jni/opus/silk/decode_core.c | 238 + TMessagesProj/jni/opus/silk/decode_frame.c | 128 + TMessagesProj/jni/opus/silk/decode_indices.c | 151 + .../jni/opus/silk/decode_parameters.c | 115 + TMessagesProj/jni/opus/silk/decode_pitch.c | 77 + TMessagesProj/jni/opus/silk/decode_pulses.c | 115 + TMessagesProj/jni/opus/silk/decoder_set_fs.c | 108 + TMessagesProj/jni/opus/silk/define.h | 235 + TMessagesProj/jni/opus/silk/enc_API.c | 556 +++ TMessagesProj/jni/opus/silk/encode_indices.c | 181 + TMessagesProj/jni/opus/silk/encode_pulses.c | 206 + TMessagesProj/jni/opus/silk/errors.h | 98 + .../opus/silk/fixed/LTP_analysis_filter_FIX.c | 85 + .../jni/opus/silk/fixed/LTP_scale_ctrl_FIX.c | 53 + .../opus/silk/fixed/apply_sine_window_FIX.c | 101 + .../jni/opus/silk/fixed/autocorr_FIX.c | 48 + .../jni/opus/silk/fixed/burg_modified_FIX.c | 279 ++ .../jni/opus/silk/fixed/corrMatrix_FIX.c | 156 + .../jni/opus/silk/fixed/encode_frame_FIX.c | 385 ++ .../jni/opus/silk/fixed/find_LPC_FIX.c | 151 + .../jni/opus/silk/fixed/find_LTP_FIX.c | 244 + .../jni/opus/silk/fixed/find_pitch_lags_FIX.c | 145 + .../jni/opus/silk/fixed/find_pred_coefs_FIX.c | 147 + TMessagesProj/jni/opus/silk/fixed/k2a_FIX.c | 53 + .../jni/opus/silk/fixed/k2a_Q16_FIX.c | 53 + TMessagesProj/jni/opus/silk/fixed/main_FIX.h | 257 + .../silk/fixed/noise_shape_analysis_FIX.c | 445 ++ .../opus/silk/fixed/pitch_analysis_core_FIX.c | 744 +++ .../jni/opus/silk/fixed/prefilter_FIX.c | 209 + .../jni/opus/silk/fixed/process_gains_FIX.c | 117 + .../silk/fixed/regularize_correlations_FIX.c | 47 + .../opus/silk/fixed/residual_energy16_FIX.c | 103 + .../jni/opus/silk/fixed/residual_energy_FIX.c | 97 + .../jni/opus/silk/fixed/schur64_FIX.c | 92 + TMessagesProj/jni/opus/silk/fixed/schur_FIX.c | 106 + .../jni/opus/silk/fixed/solve_LS_FIX.c | 249 + .../jni/opus/silk/fixed/structs_FIX.h | 133 + .../jni/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 + .../jni/opus/silk/float/LTP_scale_ctrl_FLP.c | 52 + .../jni/opus/silk/float/SigProc_FLP.h | 204 + .../opus/silk/float/apply_sine_window_FLP.c | 81 + .../jni/opus/silk/float/autocorrelation_FLP.c | 52 + .../jni/opus/silk/float/burg_modified_FLP.c | 186 + .../jni/opus/silk/float/bwexpander_FLP.c | 49 + .../jni/opus/silk/float/corrMatrix_FLP.c | 93 + .../jni/opus/silk/float/encode_frame_FLP.c | 372 ++ .../jni/opus/silk/float/energy_FLP.c | 60 + .../jni/opus/silk/float/find_LPC_FLP.c | 104 + .../jni/opus/silk/float/find_LTP_FLP.c | 132 + .../jni/opus/silk/float/find_pitch_lags_FLP.c | 132 + .../jni/opus/silk/float/find_pred_coefs_FLP.c | 117 + .../jni/opus/silk/float/inner_product_FLP.c | 60 + TMessagesProj/jni/opus/silk/float/k2a_FLP.c | 53 + .../jni/opus/silk/float/levinsondurbin_FLP.c | 81 + TMessagesProj/jni/opus/silk/float/main_FLP.h | 312 ++ .../silk/float/noise_shape_analysis_FLP.c | 365 ++ .../opus/silk/float/pitch_analysis_core_FLP.c | 630 +++ .../jni/opus/silk/float/prefilter_FLP.c | 206 + .../jni/opus/silk/float/process_gains_FLP.c | 103 + .../silk/float/regularize_correlations_FLP.c | 48 + .../jni/opus/silk/float/residual_energy_FLP.c | 117 + .../opus/silk/float/scale_copy_vector_FLP.c | 57 + .../jni/opus/silk/float/scale_vector_FLP.c | 56 + TMessagesProj/jni/opus/silk/float/schur_FLP.c | 70 + .../jni/opus/silk/float/solve_LS_FLP.c | 207 + TMessagesProj/jni/opus/silk/float/sort_FLP.c | 83 + .../jni/opus/silk/float/structs_FLP.h | 131 + .../silk/float/warped_autocorrelation_FLP.c | 73 + .../jni/opus/silk/float/wrappers_FLP.c | 201 + TMessagesProj/jni/opus/silk/gain_quant.c | 141 + TMessagesProj/jni/opus/silk/init_decoder.c | 56 + TMessagesProj/jni/opus/silk/init_encoder.c | 64 + .../jni/opus/silk/inner_prod_aligned.c | 47 + TMessagesProj/jni/opus/silk/interpolate.c | 51 + TMessagesProj/jni/opus/silk/lin2log.c | 46 + TMessagesProj/jni/opus/silk/log2lin.c | 58 + TMessagesProj/jni/opus/silk/macros.h | 115 + TMessagesProj/jni/opus/silk/main.h | 438 ++ .../jni/opus/silk/pitch_est_defines.h | 88 + .../jni/opus/silk/pitch_est_tables.c | 99 + TMessagesProj/jni/opus/silk/process_NLSFs.c | 105 + TMessagesProj/jni/opus/silk/quant_LTP_gains.c | 128 + TMessagesProj/jni/opus/silk/resampler.c | 215 + TMessagesProj/jni/opus/silk/resampler_down2.c | 74 + .../jni/opus/silk/resampler_down2_3.c | 103 + .../jni/opus/silk/resampler_private.h | 88 + .../jni/opus/silk/resampler_private_AR2.c | 55 + .../jni/opus/silk/resampler_private_IIR_FIR.c | 107 + .../opus/silk/resampler_private_down_FIR.c | 194 + .../jni/opus/silk/resampler_private_up2_HQ.c | 113 + TMessagesProj/jni/opus/silk/resampler_rom.c | 96 + TMessagesProj/jni/opus/silk/resampler_rom.h | 68 + .../jni/opus/silk/resampler_structs.h | 60 + TMessagesProj/jni/opus/silk/shell_coder.c | 151 + TMessagesProj/jni/opus/silk/sigm_Q15.c | 76 + TMessagesProj/jni/opus/silk/sort.c | 154 + TMessagesProj/jni/opus/silk/stereo_LR_to_MS.c | 229 + TMessagesProj/jni/opus/silk/stereo_MS_to_LR.c | 85 + .../jni/opus/silk/stereo_decode_pred.c | 73 + .../jni/opus/silk/stereo_encode_pred.c | 62 + .../jni/opus/silk/stereo_find_predictor.c | 79 + .../jni/opus/silk/stereo_quant_pred.c | 73 + TMessagesProj/jni/opus/silk/structs.h | 327 ++ TMessagesProj/jni/opus/silk/sum_sqr_shift.c | 85 + TMessagesProj/jni/opus/silk/table_LSF_cos.c | 70 + TMessagesProj/jni/opus/silk/tables.h | 122 + TMessagesProj/jni/opus/silk/tables_LTP.c | 296 ++ .../jni/opus/silk/tables_NLSF_CB_NB_MB.c | 159 + .../jni/opus/silk/tables_NLSF_CB_WB.c | 198 + TMessagesProj/jni/opus/silk/tables_gain.c | 63 + TMessagesProj/jni/opus/silk/tables_other.c | 138 + .../jni/opus/silk/tables_pitch_lag.c | 69 + .../jni/opus/silk/tables_pulses_per_block.c | 264 + .../jni/opus/silk/tuning_parameters.h | 171 + TMessagesProj/jni/opus/silk/typedef.h | 78 + TMessagesProj/jni/opus/src/analysis.c | 645 +++ TMessagesProj/jni/opus/src/analysis.h | 90 + TMessagesProj/jni/opus/src/mlp.c | 140 + TMessagesProj/jni/opus/src/mlp.h | 41 + TMessagesProj/jni/opus/src/mlp_data.c | 105 + TMessagesProj/jni/opus/src/opus.c | 329 ++ TMessagesProj/jni/opus/src/opus_compare.c | 379 ++ TMessagesProj/jni/opus/src/opus_decoder.c | 970 ++++ TMessagesProj/jni/opus/src/opus_encoder.c | 2488 ++++++++++ TMessagesProj/jni/opus/src/opus_multistream.c | 92 + .../jni/opus/src/opus_multistream_decoder.c | 537 ++ .../jni/opus/src/opus_multistream_encoder.c | 1174 +++++ TMessagesProj/jni/opus/src/opus_private.h | 129 + TMessagesProj/jni/opus/src/repacketizer.c | 345 ++ .../jni/opus/src/repacketizer_demo.c | 217 + TMessagesProj/jni/opus/src/tansig_table.h | 45 + ..._telegram_SQLite_SQLitePreparedStatement.c | 3 + TMessagesProj/jni/sqlite3.c | 4400 ++++++++++------- TMessagesProj/jni/sqlite3.h | 9 +- TMessagesProj/jni/sqlite3ext.h | 487 -- TMessagesProj/libs/HockeySDK-3.0.1.jar | Bin 105133 -> 0 bytes .../libs/armeabi-v7a/libtmessages.so | Bin 619412 -> 766628 bytes TMessagesProj/libs/armeabi/libtmessages.so | Bin 561980 -> 782992 bytes TMessagesProj/libs/x86/libtmessages.so | Bin 1028992 -> 1352692 bytes TMessagesProj/src/main/AndroidManifest.xml | 40 +- .../org/telegram/PhoneFormat/PhoneFormat.java | 14 +- .../messenger/AuthenticatorService.java | 28 +- .../org/telegram/messenger/AwakeService.java | 68 + .../telegram/messenger/BuffersStorage.java | 15 +- .../telegram/messenger/ByteBufferDesc.java | 2 +- .../messenger/ConnectionsManager.java | 116 +- .../messenger/ContactsController.java | 115 +- .../org/telegram/messenger/Datacenter.java | 17 +- .../java/org/telegram/messenger/Emoji.java | 2 +- .../messenger/ExportAuthorizationAction.java | 4 +- .../telegram/messenger/FileLoadOperation.java | 18 +- .../org/telegram/messenger/FileLoader.java | 127 +- .../java/org/telegram/messenger/FileLog.java | 53 +- .../messenger/FileUploadOperation.java | 4 +- .../messenger/GcmBroadcastReceiver.java | 45 +- .../telegram/messenger/LocaleController.java | 79 + .../telegram/messenger/MediaController.java | 920 +++- .../messenger/MessagesController.java | 887 ++-- .../telegram/messenger/MessagesStorage.java | 124 +- .../org/telegram/messenger/NativeLoader.java | 120 + .../messenger/NotificationCenter.java | 16 +- .../telegram/messenger/ScreenReceiver.java | 26 + .../org/telegram/messenger/SmsListener.java | 2 +- .../org/telegram/messenger/TLClassStore.java | 2 + .../java/org/telegram/messenger/TLRPC.java | 60 +- .../org/telegram/messenger/TcpConnection.java | 182 +- .../org/telegram/messenger/UserConfig.java | 2 +- .../org/telegram/messenger/Utilities.java | 181 +- .../org/telegram/objects/MessageObject.java | 137 +- .../org/telegram/objects/PhotoObject.java | 4 +- .../ui/Adapters/ContactsActivityAdapter.java | 39 +- .../ContactsActivitySearchAdapter.java | 6 +- .../org/telegram/ui/ApplicationLoader.java | 100 +- .../org/telegram/ui/Cells/ChatAudioCell.java | 63 +- .../org/telegram/ui/Cells/ChatBaseCell.java | 14 +- .../org/telegram/ui/Cells/ChatOrUserCell.java | 12 +- .../org/telegram/ui/Cells/DialogCell.java | 47 +- .../java/org/telegram/ui/ChatActivity.java | 749 ++- .../org/telegram/ui/ChatProfileActivity.java | 147 +- .../ui/ChatProfileChangeNameActivity.java | 15 +- .../org/telegram/ui/ContactAddActivity.java | 36 +- .../org/telegram/ui/ContactsActivity.java | 60 +- .../telegram/ui/DocumentSelectActivity.java | 13 +- .../org/telegram/ui/GalleryImageViewer.java | 202 +- .../org/telegram/ui/GroupCreateActivity.java | 64 +- .../telegram/ui/GroupCreateFinalActivity.java | 75 +- .../org/telegram/ui/IdenticonActivity.java | 9 +- .../java/org/telegram/ui/IntroActivity.java | 2 + .../java/org/telegram/ui/LaunchActivity.java | 176 +- .../org/telegram/ui/LocationActivity.java | 29 +- .../java/org/telegram/ui/LoginActivity.java | 6 +- .../telegram/ui/LoginActivityPhoneView.java | 33 +- .../ui/LoginActivityRegisterView.java | 33 +- .../org/telegram/ui/LoginActivitySmsView.java | 41 +- .../java/org/telegram/ui/MediaActivity.java | 56 +- .../org/telegram/ui/MessagesActivity.java | 146 +- .../org/telegram/ui/PhotoCropActivity.java | 9 +- .../org/telegram/ui/SettingsActivity.java | 217 +- .../org/telegram/ui/SettingsBlockedUsers.java | 33 +- .../ui/SettingsChangeNameActivity.java | 21 +- .../ui/SettingsNotificationsActivity.java | 56 +- .../ui/SettingsWallpapersActivity.java | 41 +- .../org/telegram/ui/UserProfileActivity.java | 215 +- .../org/telegram/ui/Views/AvatarUpdater.java | 14 +- .../telegram/ui/Views/BackupImageView.java | 20 +- .../org/telegram/ui/Views/BaseFragment.java | 8 +- .../java/org/telegram/ui/Views/EmojiView.java | 3 +- .../org/telegram/ui/Views/ImageReceiver.java | 20 +- .../telegram/ui/Views/NotificationView.java | 12 +- .../org/telegram/ui/Views/TimerButton.java | 12 +- .../res/layout-ar/chat_profile_add_row.xml | 1 - .../chat_profile_change_name_layout.xml | 1 - .../main/res/layout-ar/contact_add_layout.xml | 2 - .../layout-ar/contacts_invite_row_layout.xml | 1 - .../main/res/layout-ar/contacts_layout.xml | 1 - .../res/layout-ar/country_select_layout.xml | 1 - .../layout-ar/encrypted_chat_placeholder.xml | 6 +- .../layout-ar/group_create_final_layout.xml | 1 - .../res/layout-ar/group_create_layout.xml | 2 - .../src/main/res/layout-ar/messages_list.xml | 3 - .../settings_blocked_users_layout.xml | 1 - .../layout-ar/settings_change_name_layout.xml | 2 - .../res/layout-ar/settings_name_layout.xml | 1 - .../chat_group_incoming_document_layout.xml | 1 - .../chat_group_incoming_location_layout.xml | 1 - .../chat_group_incoming_video_layout.xml | 1 - .../layout/chat_incoming_document_layout.xml | 1 - .../layout/chat_incoming_location_layout.xml | 1 - .../res/layout/chat_incoming_video_layout.xml | 1 - .../src/main/res/layout/chat_layout.xml | 61 +- .../layout/chat_outgoing_document_layout.xml | 1 - .../layout/chat_outgoing_location_layout.xml | 1 - .../res/layout/chat_outgoing_video_layout.xml | 1 - .../main/res/layout/chat_profile_add_row.xml | 1 - .../chat_profile_change_name_layout.xml | 1 - .../main/res/layout/contact_add_layout.xml | 2 - .../res/layout/contacts_invite_row_layout.xml | 1 - .../src/main/res/layout/contacts_layout.xml | 1 - .../main/res/layout/country_select_layout.xml | 1 - .../res/layout/document_select_layout.xml | 1 - .../res/layout/encrypted_chat_placeholder.xml | 6 +- .../res/layout/group_create_done_layout.xml | 36 +- .../res/layout/group_create_final_layout.xml | 1 - .../main/res/layout/group_create_layout.xml | 2 - .../group_profile_add_member_layout.xml | 9 - .../src/main/res/layout/intro_layout.xml | 1 - .../res/layout/location_attach_layout.xml | 1 - .../src/main/res/layout/login_layout.xml | 7 - .../src/main/res/layout/media_layout.xml | 1 - .../src/main/res/layout/messages_list.xml | 3 - .../layout/settings_blocked_users_layout.xml | 1 - .../layout/settings_change_name_layout.xml | 2 - .../res/layout/settings_do_action_layout.xml | 2 - .../res/layout/settings_logout_button.xml | 1 - .../main/res/layout/settings_name_layout.xml | 1 - .../res/layout/settings_row_detail_layout.xml | 4 +- .../settings_unblock_info_row_layout.xml | 1 - .../res/layout/settings_wallpapers_layout.xml | 2 - .../main/res/layout/user_profile_layout.xml | 4 +- .../src/main/res/menu/gallery_video_menu.xml | 10 - .../src/main/res/values-ar/strings.xml | 2 + .../src/main/res/values-de/strings.xml | 66 +- .../src/main/res/values-es/strings.xml | 20 +- .../src/main/res/values-it/strings.xml | 356 ++ .../src/main/res/values-nl/strings.xml | 30 +- TMessagesProj/src/main/res/values/strings.xml | 4 +- gradle.properties | 3 + gradle/wrapper/gradle-wrapper.properties | 4 +- 394 files changed, 73005 insertions(+), 4675 deletions(-) create mode 100644 TMessagesProj/config/debug/AndroidManifest.xml create mode 100644 TMessagesProj/config/foss/AndroidManifest.xml create mode 100644 TMessagesProj/config/release/AndroidManifest.xml create mode 100644 TMessagesProj/jni/audio.c create mode 100644 TMessagesProj/jni/opus/celt/_kiss_fft_guts.h create mode 100644 TMessagesProj/jni/opus/celt/arch.h create mode 100755 TMessagesProj/jni/opus/celt/arm/arm2gnu.pl create mode 100644 TMessagesProj/jni/opus/celt/arm/arm_celt_map.c create mode 100644 TMessagesProj/jni/opus/celt/arm/armcpu.c create mode 100644 TMessagesProj/jni/opus/celt/arm/armcpu.h create mode 100644 TMessagesProj/jni/opus/celt/arm/armopts.s.in create mode 100644 TMessagesProj/jni/opus/celt/arm/celt_pitch_xcorr_arm.s create mode 100644 TMessagesProj/jni/opus/celt/arm/fixed_armv4.h create mode 100644 TMessagesProj/jni/opus/celt/arm/fixed_armv5e.h create mode 100644 TMessagesProj/jni/opus/celt/arm/kiss_fft_armv4.h create mode 100644 TMessagesProj/jni/opus/celt/arm/kiss_fft_armv5e.h create mode 100644 TMessagesProj/jni/opus/celt/arm/pitch_arm.h create mode 100644 TMessagesProj/jni/opus/celt/bands.c create mode 100644 TMessagesProj/jni/opus/celt/bands.h create mode 100644 TMessagesProj/jni/opus/celt/celt.c create mode 100644 TMessagesProj/jni/opus/celt/celt.h create mode 100644 TMessagesProj/jni/opus/celt/celt_decoder.c create mode 100644 TMessagesProj/jni/opus/celt/celt_encoder.c create mode 100644 TMessagesProj/jni/opus/celt/celt_lpc.c create mode 100644 TMessagesProj/jni/opus/celt/celt_lpc.h create mode 100644 TMessagesProj/jni/opus/celt/cpu_support.h create mode 100644 TMessagesProj/jni/opus/celt/cwrs.c create mode 100644 TMessagesProj/jni/opus/celt/cwrs.h create mode 100644 TMessagesProj/jni/opus/celt/ecintrin.h create mode 100644 TMessagesProj/jni/opus/celt/entcode.c create mode 100644 TMessagesProj/jni/opus/celt/entcode.h create mode 100644 TMessagesProj/jni/opus/celt/entdec.c create mode 100644 TMessagesProj/jni/opus/celt/entdec.h create mode 100644 TMessagesProj/jni/opus/celt/entenc.c create mode 100644 TMessagesProj/jni/opus/celt/entenc.h create mode 100644 TMessagesProj/jni/opus/celt/fixed_debug.h create mode 100644 TMessagesProj/jni/opus/celt/fixed_generic.h create mode 100644 TMessagesProj/jni/opus/celt/float_cast.h create mode 100644 TMessagesProj/jni/opus/celt/kiss_fft.c create mode 100644 TMessagesProj/jni/opus/celt/kiss_fft.h create mode 100644 TMessagesProj/jni/opus/celt/laplace.c create mode 100644 TMessagesProj/jni/opus/celt/laplace.h create mode 100644 TMessagesProj/jni/opus/celt/mathops.c create mode 100644 TMessagesProj/jni/opus/celt/mathops.h create mode 100644 TMessagesProj/jni/opus/celt/mdct.c create mode 100644 TMessagesProj/jni/opus/celt/mdct.h create mode 100644 TMessagesProj/jni/opus/celt/mfrngcod.h create mode 100644 TMessagesProj/jni/opus/celt/modes.c create mode 100644 TMessagesProj/jni/opus/celt/modes.h create mode 100644 TMessagesProj/jni/opus/celt/opus_custom_demo.c create mode 100644 TMessagesProj/jni/opus/celt/os_support.h create mode 100644 TMessagesProj/jni/opus/celt/pitch.c create mode 100644 TMessagesProj/jni/opus/celt/pitch.h create mode 100644 TMessagesProj/jni/opus/celt/quant_bands.c create mode 100644 TMessagesProj/jni/opus/celt/quant_bands.h create mode 100644 TMessagesProj/jni/opus/celt/rate.c create mode 100644 TMessagesProj/jni/opus/celt/rate.h create mode 100644 TMessagesProj/jni/opus/celt/stack_alloc.h create mode 100644 TMessagesProj/jni/opus/celt/static_modes_fixed.h create mode 100644 TMessagesProj/jni/opus/celt/static_modes_float.h create mode 100644 TMessagesProj/jni/opus/celt/vq.c create mode 100644 TMessagesProj/jni/opus/celt/vq.h create mode 100644 TMessagesProj/jni/opus/celt/x86/pitch_sse.h create mode 100644 TMessagesProj/jni/opus/include/opus.h create mode 100644 TMessagesProj/jni/opus/include/opus_custom.h create mode 100644 TMessagesProj/jni/opus/include/opus_defines.h create mode 100644 TMessagesProj/jni/opus/include/opus_multistream.h create mode 100644 TMessagesProj/jni/opus/include/opus_types.h create mode 100644 TMessagesProj/jni/opus/ogg/bitwise.c create mode 100644 TMessagesProj/jni/opus/ogg/framing.c create mode 100644 TMessagesProj/jni/opus/ogg/ogg.h create mode 100644 TMessagesProj/jni/opus/ogg/os_types.h create mode 100644 TMessagesProj/jni/opus/opusfile/info.c create mode 100644 TMessagesProj/jni/opus/opusfile/internal.c create mode 100644 TMessagesProj/jni/opus/opusfile/internal.h create mode 100644 TMessagesProj/jni/opus/opusfile/opusfile.c create mode 100644 TMessagesProj/jni/opus/opusfile/opusfile.h create mode 100644 TMessagesProj/jni/opus/opusfile/stream.c create mode 100644 TMessagesProj/jni/opus/silk/A2NLSF.c create mode 100644 TMessagesProj/jni/opus/silk/API.h create mode 100644 TMessagesProj/jni/opus/silk/CNG.c create mode 100644 TMessagesProj/jni/opus/silk/HP_variable_cutoff.c create mode 100644 TMessagesProj/jni/opus/silk/Inlines.h create mode 100644 TMessagesProj/jni/opus/silk/LPC_analysis_filter.c create mode 100644 TMessagesProj/jni/opus/silk/LPC_inv_pred_gain.c create mode 100644 TMessagesProj/jni/opus/silk/LP_variable_cutoff.c create mode 100644 TMessagesProj/jni/opus/silk/MacroCount.h create mode 100644 TMessagesProj/jni/opus/silk/MacroDebug.h create mode 100644 TMessagesProj/jni/opus/silk/NLSF2A.c create mode 100644 TMessagesProj/jni/opus/silk/NLSF_VQ.c create mode 100644 TMessagesProj/jni/opus/silk/NLSF_VQ_weights_laroia.c create mode 100644 TMessagesProj/jni/opus/silk/NLSF_decode.c create mode 100644 TMessagesProj/jni/opus/silk/NLSF_del_dec_quant.c create mode 100644 TMessagesProj/jni/opus/silk/NLSF_encode.c create mode 100644 TMessagesProj/jni/opus/silk/NLSF_stabilize.c create mode 100644 TMessagesProj/jni/opus/silk/NLSF_unpack.c create mode 100644 TMessagesProj/jni/opus/silk/NSQ.c create mode 100644 TMessagesProj/jni/opus/silk/NSQ_del_dec.c create mode 100644 TMessagesProj/jni/opus/silk/PLC.c create mode 100644 TMessagesProj/jni/opus/silk/PLC.h create mode 100644 TMessagesProj/jni/opus/silk/SigProc_FIX.h create mode 100644 TMessagesProj/jni/opus/silk/VAD.c create mode 100644 TMessagesProj/jni/opus/silk/VQ_WMat_EC.c create mode 100644 TMessagesProj/jni/opus/silk/ana_filt_bank_1.c create mode 100644 TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv4.h create mode 100644 TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv5e.h create mode 100644 TMessagesProj/jni/opus/silk/arm/macros_armv4.h create mode 100644 TMessagesProj/jni/opus/silk/arm/macros_armv5e.h create mode 100644 TMessagesProj/jni/opus/silk/biquad_alt.c create mode 100644 TMessagesProj/jni/opus/silk/bwexpander.c create mode 100644 TMessagesProj/jni/opus/silk/bwexpander_32.c create mode 100644 TMessagesProj/jni/opus/silk/check_control_input.c create mode 100644 TMessagesProj/jni/opus/silk/code_signs.c create mode 100644 TMessagesProj/jni/opus/silk/control.h create mode 100644 TMessagesProj/jni/opus/silk/control_SNR.c create mode 100644 TMessagesProj/jni/opus/silk/control_audio_bandwidth.c create mode 100644 TMessagesProj/jni/opus/silk/control_codec.c create mode 100644 TMessagesProj/jni/opus/silk/debug.c create mode 100644 TMessagesProj/jni/opus/silk/debug.h create mode 100644 TMessagesProj/jni/opus/silk/dec_API.c create mode 100644 TMessagesProj/jni/opus/silk/decode_core.c create mode 100644 TMessagesProj/jni/opus/silk/decode_frame.c create mode 100644 TMessagesProj/jni/opus/silk/decode_indices.c create mode 100644 TMessagesProj/jni/opus/silk/decode_parameters.c create mode 100644 TMessagesProj/jni/opus/silk/decode_pitch.c create mode 100644 TMessagesProj/jni/opus/silk/decode_pulses.c create mode 100644 TMessagesProj/jni/opus/silk/decoder_set_fs.c create mode 100644 TMessagesProj/jni/opus/silk/define.h create mode 100644 TMessagesProj/jni/opus/silk/enc_API.c create mode 100644 TMessagesProj/jni/opus/silk/encode_indices.c create mode 100644 TMessagesProj/jni/opus/silk/encode_pulses.c create mode 100644 TMessagesProj/jni/opus/silk/errors.h create mode 100644 TMessagesProj/jni/opus/silk/fixed/LTP_analysis_filter_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/LTP_scale_ctrl_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/apply_sine_window_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/autocorr_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/burg_modified_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/corrMatrix_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/encode_frame_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/find_LPC_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/find_LTP_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/find_pitch_lags_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/find_pred_coefs_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/k2a_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/k2a_Q16_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/main_FIX.h create mode 100644 TMessagesProj/jni/opus/silk/fixed/noise_shape_analysis_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/pitch_analysis_core_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/prefilter_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/process_gains_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/regularize_correlations_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/residual_energy16_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/residual_energy_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/schur64_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/schur_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/solve_LS_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/structs_FIX.h create mode 100644 TMessagesProj/jni/opus/silk/fixed/vector_ops_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/fixed/warped_autocorrelation_FIX.c create mode 100644 TMessagesProj/jni/opus/silk/float/LPC_analysis_filter_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/LPC_inv_pred_gain_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/LTP_analysis_filter_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/LTP_scale_ctrl_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/SigProc_FLP.h create mode 100644 TMessagesProj/jni/opus/silk/float/apply_sine_window_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/autocorrelation_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/burg_modified_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/bwexpander_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/corrMatrix_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/encode_frame_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/energy_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/find_LPC_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/find_LTP_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/find_pitch_lags_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/find_pred_coefs_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/inner_product_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/k2a_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/levinsondurbin_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/main_FLP.h create mode 100644 TMessagesProj/jni/opus/silk/float/noise_shape_analysis_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/pitch_analysis_core_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/prefilter_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/process_gains_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/regularize_correlations_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/residual_energy_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/scale_copy_vector_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/scale_vector_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/schur_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/solve_LS_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/sort_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/structs_FLP.h create mode 100644 TMessagesProj/jni/opus/silk/float/warped_autocorrelation_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/float/wrappers_FLP.c create mode 100644 TMessagesProj/jni/opus/silk/gain_quant.c create mode 100644 TMessagesProj/jni/opus/silk/init_decoder.c create mode 100644 TMessagesProj/jni/opus/silk/init_encoder.c create mode 100644 TMessagesProj/jni/opus/silk/inner_prod_aligned.c create mode 100644 TMessagesProj/jni/opus/silk/interpolate.c create mode 100644 TMessagesProj/jni/opus/silk/lin2log.c create mode 100644 TMessagesProj/jni/opus/silk/log2lin.c create mode 100644 TMessagesProj/jni/opus/silk/macros.h create mode 100644 TMessagesProj/jni/opus/silk/main.h create mode 100644 TMessagesProj/jni/opus/silk/pitch_est_defines.h create mode 100644 TMessagesProj/jni/opus/silk/pitch_est_tables.c create mode 100644 TMessagesProj/jni/opus/silk/process_NLSFs.c create mode 100644 TMessagesProj/jni/opus/silk/quant_LTP_gains.c create mode 100644 TMessagesProj/jni/opus/silk/resampler.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_down2.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_down2_3.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_private.h create mode 100644 TMessagesProj/jni/opus/silk/resampler_private_AR2.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_private_IIR_FIR.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_private_down_FIR.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_private_up2_HQ.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_rom.c create mode 100644 TMessagesProj/jni/opus/silk/resampler_rom.h create mode 100644 TMessagesProj/jni/opus/silk/resampler_structs.h create mode 100644 TMessagesProj/jni/opus/silk/shell_coder.c create mode 100644 TMessagesProj/jni/opus/silk/sigm_Q15.c create mode 100644 TMessagesProj/jni/opus/silk/sort.c create mode 100644 TMessagesProj/jni/opus/silk/stereo_LR_to_MS.c create mode 100644 TMessagesProj/jni/opus/silk/stereo_MS_to_LR.c create mode 100644 TMessagesProj/jni/opus/silk/stereo_decode_pred.c create mode 100644 TMessagesProj/jni/opus/silk/stereo_encode_pred.c create mode 100644 TMessagesProj/jni/opus/silk/stereo_find_predictor.c create mode 100644 TMessagesProj/jni/opus/silk/stereo_quant_pred.c create mode 100644 TMessagesProj/jni/opus/silk/structs.h create mode 100644 TMessagesProj/jni/opus/silk/sum_sqr_shift.c create mode 100644 TMessagesProj/jni/opus/silk/table_LSF_cos.c create mode 100644 TMessagesProj/jni/opus/silk/tables.h create mode 100644 TMessagesProj/jni/opus/silk/tables_LTP.c create mode 100644 TMessagesProj/jni/opus/silk/tables_NLSF_CB_NB_MB.c create mode 100644 TMessagesProj/jni/opus/silk/tables_NLSF_CB_WB.c create mode 100644 TMessagesProj/jni/opus/silk/tables_gain.c create mode 100644 TMessagesProj/jni/opus/silk/tables_other.c create mode 100644 TMessagesProj/jni/opus/silk/tables_pitch_lag.c create mode 100644 TMessagesProj/jni/opus/silk/tables_pulses_per_block.c create mode 100644 TMessagesProj/jni/opus/silk/tuning_parameters.h create mode 100644 TMessagesProj/jni/opus/silk/typedef.h create mode 100644 TMessagesProj/jni/opus/src/analysis.c create mode 100644 TMessagesProj/jni/opus/src/analysis.h create mode 100644 TMessagesProj/jni/opus/src/mlp.c create mode 100644 TMessagesProj/jni/opus/src/mlp.h create mode 100644 TMessagesProj/jni/opus/src/mlp_data.c create mode 100644 TMessagesProj/jni/opus/src/opus.c create mode 100644 TMessagesProj/jni/opus/src/opus_compare.c create mode 100644 TMessagesProj/jni/opus/src/opus_decoder.c create mode 100644 TMessagesProj/jni/opus/src/opus_encoder.c create mode 100644 TMessagesProj/jni/opus/src/opus_multistream.c create mode 100644 TMessagesProj/jni/opus/src/opus_multistream_decoder.c create mode 100644 TMessagesProj/jni/opus/src/opus_multistream_encoder.c create mode 100644 TMessagesProj/jni/opus/src/opus_private.h create mode 100644 TMessagesProj/jni/opus/src/repacketizer.c create mode 100644 TMessagesProj/jni/opus/src/repacketizer_demo.c create mode 100644 TMessagesProj/jni/opus/src/tansig_table.h delete mode 100644 TMessagesProj/jni/sqlite3ext.h delete mode 100644 TMessagesProj/libs/HockeySDK-3.0.1.jar create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/AwakeService.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/ScreenReceiver.java delete mode 100644 TMessagesProj/src/main/res/menu/gallery_video_menu.xml create mode 100644 TMessagesProj/src/main/res/values-it/strings.xml create mode 100644 gradle.properties diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 869bae73..f3c1a2c2 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:0.8.+' + classpath 'com.android.tools.build:gradle:0.9.+' } } apply plugin: 'android' @@ -12,50 +12,40 @@ repositories { mavenCentral() } -task nativeLibsToJar( - type: Zip, - description: 'create a jar archive of the native libs') { - destinationDir file("$buildDir/native-libs") - baseName 'native-libs' - extension 'jar' - from fileTree(dir: 'libs', include: '**/*.so') - into 'lib/' -} - tasks.withType(JavaCompile) { options.encoding = "UTF-8" } -tasks.withType(JavaCompile) { - compileTask -> compileTask.dependsOn(nativeLibsToJar) -} - dependencies { - compile 'com.google.android.gms:play-services:4.1.+' - compile 'net.hockeyapp.android:HockeySDK:3.0.1' compile 'com.android.support:support-v4:19.0.+' compile 'com.android.support:appcompat-v7:19.0.+' - compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') + compile 'com.google.android.gms:play-services:4.1.+' + compile 'net.hockeyapp.android:HockeySDK:3.0.1' } android { compileSdkVersion 19 - buildToolsVersion '19.0.1' + buildToolsVersion '19.0.3' + + aaptOptions.useAaptPngCruncher = true signingConfigs { debug { - storeFile file("debug.keystore") + storeFile file("config/debug.keystore") } release { - storeFile file("release.keystore") + storeFile file("config/release.keystore") + storePassword RELEASE_STORE_PASSWORD + keyAlias RELEASE_KEY_ALIAS + keyPassword RELEASE_KEY_PASSWORD } } buildTypes { debug { debuggable true - jniDebugBuild true + jniDebugBuild false signingConfig signingConfigs.debug } @@ -64,10 +54,35 @@ android { jniDebugBuild false signingConfig signingConfigs.release } + + foss { + debuggable false + jniDebugBuild false + signingConfig signingConfigs.release + } + } + + sourceSets.main { + jniLibs.srcDir 'libs' + jni.srcDirs = [] //disable automatic ndk-build call + } + + sourceSets { + debug { + manifest.srcFile 'config/debug/AndroidManifest.xml' + } + release { + manifest.srcFile 'config/release/AndroidManifest.xml' + } + foss { + manifest.srcFile 'config/foss/AndroidManifest.xml' + } } defaultConfig { minSdkVersion 8 targetSdkVersion 19 + versionCode 207 + versionName "1.4.6" } } diff --git a/TMessagesProj/config/debug/AndroidManifest.xml b/TMessagesProj/config/debug/AndroidManifest.xml new file mode 100644 index 00000000..15b76a33 --- /dev/null +++ b/TMessagesProj/config/debug/AndroidManifest.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TMessagesProj/config/foss/AndroidManifest.xml b/TMessagesProj/config/foss/AndroidManifest.xml new file mode 100644 index 00000000..a20d76ea --- /dev/null +++ b/TMessagesProj/config/foss/AndroidManifest.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/TMessagesProj/config/release/AndroidManifest.xml b/TMessagesProj/config/release/AndroidManifest.xml new file mode 100644 index 00000000..cd2b91fd --- /dev/null +++ b/TMessagesProj/config/release/AndroidManifest.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TMessagesProj/jni/Android.mk b/TMessagesProj/jni/Android.mk index 930f2fc8..520e05f4 100755 --- a/TMessagesProj/jni/Android.mk +++ b/TMessagesProj/jni/Android.mk @@ -1,12 +1,168 @@ -NDK_TOOLCHAIN_VERSION := 4.8 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_MODULE := tmessages -LOCAL_CFLAGS = -w -std=gnu99 -O3 -LOCAL_LDLIBS := -llog +LOCAL_MODULE := tmessages +LOCAL_CFLAGS := -w -std=gnu99 -O3 -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 +LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno +LOCAL_CPPFLAGS := -DBSD=1 -ffast-math -O3 -funroll-loops +LOCAL_LDLIBS := -llog -lm -LOCAL_SRC_FILES := \ +LOCAL_SRC_FILES := \ +./opus/src/opus.c \ +./opus/src/opus_decoder.c \ +./opus/src/opus_encoder.c \ +./opus/src/opus_multistream.c \ +./opus/src/opus_multistream_encoder.c \ +./opus/src/opus_multistream_decoder.c \ +./opus/src/repacketizer.c \ +./opus/src/analysis.c \ +./opus/src/mlp.c \ +./opus/src/mlp_data.c + +LOCAL_SRC_FILES += \ +./opus/silk/CNG.c \ +./opus/silk/code_signs.c \ +./opus/silk/init_decoder.c \ +./opus/silk/decode_core.c \ +./opus/silk/decode_frame.c \ +./opus/silk/decode_parameters.c \ +./opus/silk/decode_indices.c \ +./opus/silk/decode_pulses.c \ +./opus/silk/decoder_set_fs.c \ +./opus/silk/dec_API.c \ +./opus/silk/enc_API.c \ +./opus/silk/encode_indices.c \ +./opus/silk/encode_pulses.c \ +./opus/silk/gain_quant.c \ +./opus/silk/interpolate.c \ +./opus/silk/LP_variable_cutoff.c \ +./opus/silk/NLSF_decode.c \ +./opus/silk/NSQ.c \ +./opus/silk/NSQ_del_dec.c \ +./opus/silk/PLC.c \ +./opus/silk/shell_coder.c \ +./opus/silk/tables_gain.c \ +./opus/silk/tables_LTP.c \ +./opus/silk/tables_NLSF_CB_NB_MB.c \ +./opus/silk/tables_NLSF_CB_WB.c \ +./opus/silk/tables_other.c \ +./opus/silk/tables_pitch_lag.c \ +./opus/silk/tables_pulses_per_block.c \ +./opus/silk/VAD.c \ +./opus/silk/control_audio_bandwidth.c \ +./opus/silk/quant_LTP_gains.c \ +./opus/silk/VQ_WMat_EC.c \ +./opus/silk/HP_variable_cutoff.c \ +./opus/silk/NLSF_encode.c \ +./opus/silk/NLSF_VQ.c \ +./opus/silk/NLSF_unpack.c \ +./opus/silk/NLSF_del_dec_quant.c \ +./opus/silk/process_NLSFs.c \ +./opus/silk/stereo_LR_to_MS.c \ +./opus/silk/stereo_MS_to_LR.c \ +./opus/silk/check_control_input.c \ +./opus/silk/control_SNR.c \ +./opus/silk/init_encoder.c \ +./opus/silk/control_codec.c \ +./opus/silk/A2NLSF.c \ +./opus/silk/ana_filt_bank_1.c \ +./opus/silk/biquad_alt.c \ +./opus/silk/bwexpander_32.c \ +./opus/silk/bwexpander.c \ +./opus/silk/debug.c \ +./opus/silk/decode_pitch.c \ +./opus/silk/inner_prod_aligned.c \ +./opus/silk/lin2log.c \ +./opus/silk/log2lin.c \ +./opus/silk/LPC_analysis_filter.c \ +./opus/silk/LPC_inv_pred_gain.c \ +./opus/silk/table_LSF_cos.c \ +./opus/silk/NLSF2A.c \ +./opus/silk/NLSF_stabilize.c \ +./opus/silk/NLSF_VQ_weights_laroia.c \ +./opus/silk/pitch_est_tables.c \ +./opus/silk/resampler.c \ +./opus/silk/resampler_down2_3.c \ +./opus/silk/resampler_down2.c \ +./opus/silk/resampler_private_AR2.c \ +./opus/silk/resampler_private_down_FIR.c \ +./opus/silk/resampler_private_IIR_FIR.c \ +./opus/silk/resampler_private_up2_HQ.c \ +./opus/silk/resampler_rom.c \ +./opus/silk/sigm_Q15.c \ +./opus/silk/sort.c \ +./opus/silk/sum_sqr_shift.c \ +./opus/silk/stereo_decode_pred.c \ +./opus/silk/stereo_encode_pred.c \ +./opus/silk/stereo_find_predictor.c \ +./opus/silk/stereo_quant_pred.c + +LOCAL_SRC_FILES += \ +./opus/silk/fixed/LTP_analysis_filter_FIX.c \ +./opus/silk/fixed/LTP_scale_ctrl_FIX.c \ +./opus/silk/fixed/corrMatrix_FIX.c \ +./opus/silk/fixed/encode_frame_FIX.c \ +./opus/silk/fixed/find_LPC_FIX.c \ +./opus/silk/fixed/find_LTP_FIX.c \ +./opus/silk/fixed/find_pitch_lags_FIX.c \ +./opus/silk/fixed/find_pred_coefs_FIX.c \ +./opus/silk/fixed/noise_shape_analysis_FIX.c \ +./opus/silk/fixed/prefilter_FIX.c \ +./opus/silk/fixed/process_gains_FIX.c \ +./opus/silk/fixed/regularize_correlations_FIX.c \ +./opus/silk/fixed/residual_energy16_FIX.c \ +./opus/silk/fixed/residual_energy_FIX.c \ +./opus/silk/fixed/solve_LS_FIX.c \ +./opus/silk/fixed/warped_autocorrelation_FIX.c \ +./opus/silk/fixed/apply_sine_window_FIX.c \ +./opus/silk/fixed/autocorr_FIX.c \ +./opus/silk/fixed/burg_modified_FIX.c \ +./opus/silk/fixed/k2a_FIX.c \ +./opus/silk/fixed/k2a_Q16_FIX.c \ +./opus/silk/fixed/pitch_analysis_core_FIX.c \ +./opus/silk/fixed/vector_ops_FIX.c \ +./opus/silk/fixed/schur64_FIX.c \ +./opus/silk/fixed/schur_FIX.c + +LOCAL_SRC_FILES += \ +./opus/celt/bands.c \ +./opus/celt/celt.c \ +./opus/celt/celt_encoder.c \ +./opus/celt/celt_decoder.c \ +./opus/celt/cwrs.c \ +./opus/celt/entcode.c \ +./opus/celt/entdec.c \ +./opus/celt/entenc.c \ +./opus/celt/kiss_fft.c \ +./opus/celt/laplace.c \ +./opus/celt/mathops.c \ +./opus/celt/mdct.c \ +./opus/celt/modes.c \ +./opus/celt/pitch.c \ +./opus/celt/celt_lpc.c \ +./opus/celt/quant_bands.c \ +./opus/celt/rate.c \ +./opus/celt/vq.c \ +./opus/celt/arm/armcpu.c \ +./opus/celt/arm/arm_celt_map.c + +LOCAL_SRC_FILES += \ +./opus/ogg/bitwise.c \ +./opus/ogg/framing.c \ +./opus/opusfile/info.c \ +./opus/opusfile/internal.c \ +./opus/opusfile/opusfile.c \ +./opus/opusfile/stream.c + +LOCAL_C_INCLUDES := \ +./opus/include \ +./opus/silk \ +./opus/silk/fixed \ +./opus/celt \ +./opus/ \ +./opus/opusfile + +LOCAL_SRC_FILES += \ ./aes_core.c \ ./aes_ige.c \ ./aes_misc.c \ @@ -15,7 +171,8 @@ LOCAL_SRC_FILES := \ ./org_telegram_SQLite_SQLiteCursor.c \ ./org_telegram_SQLite_SQLiteDatabase.c \ ./org_telegram_SQLite_SQLitePreparedStatement.c \ -./org_telegram_SQLite.c +./org_telegram_SQLite.c \ +./audio.c include $(BUILD_SHARED_LIBRARY) \ No newline at end of file diff --git a/TMessagesProj/jni/audio.c b/TMessagesProj/jni/audio.c new file mode 100644 index 00000000..c66314f0 --- /dev/null +++ b/TMessagesProj/jni/audio.c @@ -0,0 +1,691 @@ +#include +#include +#include +#include +#include +#include +#include +#include "log.h" + +#ifndef max +#define max(x, y) ((x) > (y)) ? (x) : (y) +#endif +#ifndef min +#define min(x, y) ((x) < (y)) ? (x) : (y) +#endif + +typedef struct { + int version; + int channels; /* Number of channels: 1..255 */ + int preskip; + ogg_uint32_t input_sample_rate; + int gain; /* in dB S7.8 should be zero whenever possible */ + int channel_mapping; + /* The rest is only used if channel_mapping != 0 */ + int nb_streams; + int nb_coupled; + unsigned char stream_map[255]; +} OpusHeader; + +typedef struct { + unsigned char *data; + int maxlen; + int pos; +} Packet; + +typedef struct { + const unsigned char *data; + int maxlen; + int pos; +} ROPacket; + +typedef struct { + void *readdata; + opus_int64 total_samples_per_channel; + int rawmode; + int channels; + long rate; + int gain; + int samplesize; + int endianness; + char *infilename; + int ignorelength; + int skip; + int extraout; + char *comments; + int comments_length; + int copy_comments; +} oe_enc_opt; + +static int write_uint32(Packet *p, ogg_uint32_t val) { + if (p->pos > p->maxlen - 4) { + return 0; + } + p->data[p->pos ] = (val ) & 0xFF; + p->data[p->pos+1] = (val>> 8) & 0xFF; + p->data[p->pos+2] = (val>>16) & 0xFF; + p->data[p->pos+3] = (val>>24) & 0xFF; + p->pos += 4; + return 1; +} + +static int write_uint16(Packet *p, ogg_uint16_t val) { + if (p->pos > p->maxlen-2) { + return 0; + } + p->data[p->pos ] = (val ) & 0xFF; + p->data[p->pos+1] = (val>> 8) & 0xFF; + p->pos += 2; + return 1; +} + +static int write_chars(Packet *p, const unsigned char *str, int nb_chars) +{ + int i; + if (p->pos>p->maxlen-nb_chars) + return 0; + for (i=0;idata[p->pos++] = str[i]; + return 1; +} + +static int read_uint32(ROPacket *p, ogg_uint32_t *val) +{ + if (p->pos>p->maxlen-4) + return 0; + *val = (ogg_uint32_t)p->data[p->pos ]; + *val |= (ogg_uint32_t)p->data[p->pos+1]<< 8; + *val |= (ogg_uint32_t)p->data[p->pos+2]<<16; + *val |= (ogg_uint32_t)p->data[p->pos+3]<<24; + p->pos += 4; + return 1; +} + +static int read_uint16(ROPacket *p, ogg_uint16_t *val) +{ + if (p->pos>p->maxlen-2) + return 0; + *val = (ogg_uint16_t)p->data[p->pos ]; + *val |= (ogg_uint16_t)p->data[p->pos+1]<<8; + p->pos += 2; + return 1; +} + +static int read_chars(ROPacket *p, unsigned char *str, int nb_chars) +{ + int i; + if (p->pos>p->maxlen-nb_chars) + return 0; + for (i=0;idata[p->pos++]; + return 1; +} + +int opus_header_to_packet(const OpusHeader *h, unsigned char *packet, int len) { + int i; + Packet p; + unsigned char ch; + + p.data = packet; + p.maxlen = len; + p.pos = 0; + if (len < 19) { + return 0; + } + if (!write_chars(&p, (const unsigned char *)"OpusHead", 8)) { + return 0; + } + + ch = 1; + if (!write_chars(&p, &ch, 1)) { + return 0; + } + + ch = h->channels; + if (!write_chars(&p, &ch, 1)) { + return 0; + } + + if (!write_uint16(&p, h->preskip)) { + return 0; + } + + if (!write_uint32(&p, h->input_sample_rate)) { + return 0; + } + + if (!write_uint16(&p, h->gain)) { + return 0; + } + + ch = h->channel_mapping; + if (!write_chars(&p, &ch, 1)) { + return 0; + } + + if (h->channel_mapping != 0) { + ch = h->nb_streams; + if (!write_chars(&p, &ch, 1)) { + return 0; + } + + ch = h->nb_coupled; + if (!write_chars(&p, &ch, 1)) { + return 0; + } + + /* Multi-stream support */ + for (i = 0; i < h->channels; i++) { + if (!write_chars(&p, &h->stream_map[i], 1)) { + return 0; + } + } + } + + return p.pos; +} + +#define writeint(buf, base, val) do { buf[base + 3] = ((val) >> 24) & 0xff; \ +buf[base + 2]=((val) >> 16) & 0xff; \ +buf[base + 1]=((val) >> 8) & 0xff; \ +buf[base] = (val) & 0xff; \ +} while(0) + +static void comment_init(char **comments, int *length, const char *vendor_string) { + // The 'vendor' field should be the actual encoding library used + int vendor_length = strlen(vendor_string); + int user_comment_list_length = 0; + int len = 8 + 4 + vendor_length + 4; + char *p = (char *)malloc(len); + memcpy(p, "OpusTags", 8); + writeint(p, 8, vendor_length); + memcpy(p + 12, vendor_string, vendor_length); + writeint(p, 12 + vendor_length, user_comment_list_length); + *length = len; + *comments = p; +} + +static void comment_pad(char **comments, int* length, int amount) { + if (amount > 0) { + char *p = *comments; + // Make sure there is at least amount worth of padding free, and round up to the maximum that fits in the current ogg segments + int newlen = (*length + amount + 255) / 255 * 255 - 1; + p = realloc(p, newlen); + for (int i = *length; i < newlen; i++) { + p[i] = 0; + } + *comments = p; + *length = newlen; + } +} + +static int writeOggPage(ogg_page *page, FILE *os) { + int written = fwrite(page->header, sizeof(unsigned char), page->header_len, os); + written += fwrite(page->body, sizeof(unsigned char), page->body_len, os); + return written; +} + +const opus_int32 bitrate = 16000; +const opus_int32 rate = 16000; +const opus_int32 frame_size = 960; +const int with_cvbr = 1; +const int max_ogg_delay = 0; +const int comment_padding = 512; + +opus_int32 coding_rate = 16000; +ogg_int32_t _packetId; +OpusEncoder *_encoder = 0; +uint8_t *_packet = 0; +ogg_stream_state os; +FILE *_fileOs = 0; +oe_enc_opt inopt; +OpusHeader header; +opus_int32 min_bytes; +int max_frame_bytes; +ogg_packet op; +ogg_page og; +opus_int64 bytes_written; +opus_int64 pages_out; +opus_int64 total_samples; +ogg_int64_t enc_granulepos; +ogg_int64_t last_granulepos; +int size_segments; +int last_segments; + +void cleanupRecorder() { + + ogg_stream_flush(&os, &og); + + if (_encoder) { + opus_encoder_destroy(_encoder); + _encoder = 0; + } + + ogg_stream_clear(&os); + + if (_packet) { + free(_packet); + _packet = 0; + } + + if (_fileOs) { + fclose(_fileOs); + _fileOs = 0; + } + + _packetId = -1; + bytes_written = 0; + pages_out = 0; + total_samples = 0; + enc_granulepos = 0; + size_segments = 0; + last_segments = 0; + last_granulepos = 0; + memset(&os, 0, sizeof(ogg_stream_state)); + memset(&inopt, 0, sizeof(oe_enc_opt)); + memset(&header, 0, sizeof(OpusHeader)); + memset(&op, 0, sizeof(ogg_packet)); + memset(&og, 0, sizeof(ogg_page)); +} + +int initRecorder(const char *path) { + cleanupRecorder(); + + if (!path) { + return 0; + } + + _fileOs = fopen(path, "wb"); + if (!_fileOs) { + return 0; + } + + inopt.rate = rate; + inopt.gain = 0; + inopt.endianness = 0; + inopt.copy_comments = 0; + inopt.rawmode = 1; + inopt.ignorelength = 1; + inopt.samplesize = 16; + inopt.channels = 1; + inopt.skip = 0; + + comment_init(&inopt.comments, &inopt.comments_length, opus_get_version_string()); + + if (rate > 24000) { + coding_rate = 48000; + } else if (rate > 16000) { + coding_rate = 24000; + } else if (rate > 12000) { + coding_rate = 16000; + } else if (rate > 8000) { + coding_rate = 12000; + } else { + coding_rate = 8000; + } + + if (rate != coding_rate) { + LOGE("Invalid rate"); + return 0; + } + + header.channels = 1; + header.channel_mapping = 0; + header.input_sample_rate = rate; + header.gain = inopt.gain; + header.nb_streams = 1; + + int result = OPUS_OK; + _encoder = opus_encoder_create(coding_rate, 1, OPUS_APPLICATION_AUDIO, &result); + if (result != OPUS_OK) { + LOGE("Error cannot create encoder: %s", opus_strerror(result)); + return 0; + } + + min_bytes = max_frame_bytes = (1275 * 3 + 7) * header.nb_streams; + _packet = malloc(max_frame_bytes); + + result = opus_encoder_ctl(_encoder, OPUS_SET_BITRATE(bitrate)); + if (result != OPUS_OK) { + LOGE("Error OPUS_SET_BITRATE returned: %s", opus_strerror(result)); + return 0; + } + +#ifdef OPUS_SET_LSB_DEPTH + result = opus_encoder_ctl(_encoder, OPUS_SET_LSB_DEPTH(max(8, min(24, inopt.samplesize)))); + if (result != OPUS_OK) { + LOGE("Warning OPUS_SET_LSB_DEPTH returned: %s", opus_strerror(result)); + } +#endif + + opus_int32 lookahead; + result = opus_encoder_ctl(_encoder, OPUS_GET_LOOKAHEAD(&lookahead)); + if (result != OPUS_OK) { + LOGE("Error OPUS_GET_LOOKAHEAD returned: %s", opus_strerror(result)); + return 0; + } + + inopt.skip += lookahead; + header.preskip = (int)(inopt.skip * (48000.0 / coding_rate)); + inopt.extraout = (int)(header.preskip * (rate / 48000.0)); + + if (ogg_stream_init(&os, rand()) == -1) { + LOGE("Error: stream init failed"); + return 0; + } + + unsigned char header_data[100]; + int packet_size = opus_header_to_packet(&header, header_data, 100); + op.packet = header_data; + op.bytes = packet_size; + op.b_o_s = 1; + op.e_o_s = 0; + op.granulepos = 0; + op.packetno = 0; + ogg_stream_packetin(&os, &op); + + while ((result = ogg_stream_flush(&os, &og))) { + if (!result) { + break; + } + + int pageBytesWritten = writeOggPage(&og, _fileOs); + if (pageBytesWritten != og.header_len + og.body_len) { + LOGE("Error: failed writing header to output stream"); + return 0; + } + bytes_written += pageBytesWritten; + pages_out++; + } + + comment_pad(&inopt.comments, &inopt.comments_length, comment_padding); + op.packet = (unsigned char *)inopt.comments; + op.bytes = inopt.comments_length; + op.b_o_s = 0; + op.e_o_s = 0; + op.granulepos = 0; + op.packetno = 1; + ogg_stream_packetin(&os, &op); + + while ((result = ogg_stream_flush(&os, &og))) { + if (result == 0) { + break; + } + + int writtenPageBytes = writeOggPage(&og, _fileOs); + if (writtenPageBytes != og.header_len + og.body_len) { + LOGE("Error: failed writing header to output stream"); + return 0; + } + + bytes_written += writtenPageBytes; + pages_out++; + } + + free(inopt.comments); + + return 1; +} + +int writeFrame(uint8_t *framePcmBytes, unsigned int frameByteCount) { + int cur_frame_size = frame_size; + _packetId++; + + opus_int32 nb_samples = frameByteCount / 2; + total_samples += nb_samples; + if (nb_samples < frame_size) { + op.e_o_s = 1; + } else { + op.e_o_s = 0; + } + + int nbBytes = 0; + + if (nb_samples != 0) { + uint8_t *paddedFrameBytes = framePcmBytes; + int freePaddedFrameBytes = 0; + + if (nb_samples < cur_frame_size) { + paddedFrameBytes = malloc(cur_frame_size * 2); + freePaddedFrameBytes = 1; + memcpy(paddedFrameBytes, framePcmBytes, frameByteCount); + memset(paddedFrameBytes + nb_samples * 2, 0, cur_frame_size * 2 - nb_samples * 2); + } + + nbBytes = opus_encode(_encoder, (opus_int16 *)paddedFrameBytes, cur_frame_size, _packet, max_frame_bytes / 10); + if (freePaddedFrameBytes) { + free(paddedFrameBytes); + paddedFrameBytes = NULL; + } + + if (nbBytes < 0) { + LOGE("Encoding failed: %s. Aborting.", opus_strerror(nbBytes)); + return 0; + } + + enc_granulepos += cur_frame_size * 48000 / coding_rate; + size_segments = (nbBytes + 255) / 255; + min_bytes = min(nbBytes, min_bytes); + } + + while ((((size_segments <= 255) && (last_segments + size_segments > 255)) || (enc_granulepos - last_granulepos > max_ogg_delay)) && ogg_stream_flush_fill(&os, &og, 255 * 255)) { + if (ogg_page_packets(&og) != 0) { + last_granulepos = ogg_page_granulepos(&og); + } + + last_segments -= og.header[26]; + int writtenPageBytes = writeOggPage(&og, _fileOs); + if (writtenPageBytes != og.header_len + og.body_len) { + LOGE("Error: failed writing data to output stream"); + return 0; + } + bytes_written += writtenPageBytes; + pages_out++; + } + + op.packet = (unsigned char *)_packet; + op.bytes = nbBytes; + op.b_o_s = 0; + op.granulepos = enc_granulepos; + if (op.e_o_s) { + op.granulepos = ((total_samples * 48000 + rate - 1) / rate) + header.preskip; + } + op.packetno = 2 + _packetId; + ogg_stream_packetin(&os, &op); + last_segments += size_segments; + + while ((op.e_o_s || (enc_granulepos + (frame_size * 48000 / coding_rate) - last_granulepos > max_ogg_delay) || (last_segments >= 255)) ? ogg_stream_flush_fill(&os, &og, 255 * 255) : ogg_stream_pageout_fill(&os, &og, 255 * 255)) { + if (ogg_page_packets(&og) != 0) { + last_granulepos = ogg_page_granulepos(&og); + } + last_segments -= og.header[26]; + int writtenPageBytes = writeOggPage(&og, _fileOs); + if (writtenPageBytes != og.header_len + og.body_len) { + LOGE("Error: failed writing data to output stream"); + return 0; + } + bytes_written += writtenPageBytes; + pages_out++; + } + + return 1; +} + +JNIEXPORT int Java_org_telegram_messenger_MediaController_startRecord(JNIEnv *env, jclass class, jstring path) { + const char *pathStr = (*env)->GetStringUTFChars(env, path, 0); + + int result = initRecorder(pathStr); + + if (pathStr != 0) { + (*env)->ReleaseStringUTFChars(env, path, pathStr); + } + + return result; +} + +JNIEXPORT int Java_org_telegram_messenger_MediaController_writeFrame(JNIEnv *env, jclass class, jobject frame, jint len) { + jbyte *frameBytes = (*env)->GetDirectBufferAddress(env, frame); + return writeFrame(frameBytes, len); +} + +JNIEXPORT void Java_org_telegram_messenger_MediaController_stopRecord(JNIEnv *env, jclass class) { + cleanupRecorder(); +} + +//player +OggOpusFile *_opusFile; +int _isSeekable = 0; +int64_t _totalPcmDuration = 0; +int64_t _currentPcmOffset = 0; +int _finished = 0; +static const int playerBuffersCount = 3; +static const int playerSampleRate = 48000; +int finished; +int pcmOffset; +int size; + +void cleanupPlayer() { + if (_opusFile) { + op_free(_opusFile); + _opusFile = 0; + } + _isSeekable = 0; + _totalPcmDuration = 0; + _currentPcmOffset = 0; + _finished = 0; +} + +int seekPlayer(float position) { + if (!_opusFile || !_isSeekable || position < 0) { + return 0; + } + int result = op_pcm_seek(_opusFile, (ogg_int64_t)(position * _totalPcmDuration)); + if (result != OPUS_OK) { + LOGE("op_pcm_seek failed: %d", result); + } + ogg_int64_t pcmPosition = op_pcm_tell(_opusFile); + _currentPcmOffset = pcmPosition; + return result == OPUS_OK; +} + +int initPlayer(const char *path) { + cleanupPlayer(); + + int openError = OPUS_OK; + _opusFile = op_open_file(path, &openError); + if (!_opusFile || openError != OPUS_OK) { + LOGE("op_open_file failed: %d", openError); + cleanupPlayer(); + return 0; + } + + _isSeekable = op_seekable(_opusFile); + _totalPcmDuration = op_pcm_total(_opusFile, -1); + + return 1; +} + +void fillBuffer(uint8_t *buffer, int capacity) { + if (_opusFile) { + pcmOffset = max(0, op_pcm_tell(_opusFile)); + + if (_finished) { + finished = 1; + size = 0; + pcmOffset = 0; + return; + } else { + int writtenOutputBytes = 0; + int endOfFileReached = 0; + + while (writtenOutputBytes < capacity) { + int readSamples = op_read(_opusFile, (opus_int16 *)(buffer + writtenOutputBytes), (capacity - writtenOutputBytes) / 2, NULL); + + if (readSamples > 0) { + writtenOutputBytes += readSamples * 2; + } else { + if (readSamples < 0) { + LOGE("op_read failed: %d", readSamples); + } + endOfFileReached = 1; + break; + } + } + + size = writtenOutputBytes; + + if (endOfFileReached || pcmOffset + size == _totalPcmDuration) { + _finished = 1; + finished = 1; + } else { + finished = 0; + } + } + } else { + memset(buffer, 0, capacity); + size = capacity; + pcmOffset = _totalPcmDuration; + } +} + +JNIEXPORT jlong Java_org_telegram_messenger_MediaController_getTotalPcmDuration(JNIEnv *env, jclass class) { + return _totalPcmDuration; +} + +JNIEXPORT int Java_org_telegram_messenger_MediaController_getFinished(JNIEnv *env, jclass class) { + return finished; +} + +JNIEXPORT int Java_org_telegram_messenger_MediaController_getSize(JNIEnv *env, jclass class) { + return size; +} + +JNIEXPORT jlong Java_org_telegram_messenger_MediaController_getPcmOffset(JNIEnv *env, jclass class) { + return pcmOffset; +} + +JNIEXPORT void Java_org_telegram_messenger_MediaController_readOpusFile(JNIEnv *env, jclass class, jobject buffer, jint capacity) { + jbyte *bufferBytes = (*env)->GetDirectBufferAddress(env, buffer); + fillBuffer(bufferBytes, capacity); +} + +JNIEXPORT int Java_org_telegram_messenger_MediaController_seekOpusFile(JNIEnv *env, jclass class, jfloat position) { + return seekPlayer(position); +} + +JNIEXPORT int Java_org_telegram_messenger_MediaController_openOpusFile(JNIEnv *env, jclass class, jstring path) { + const char *pathStr = (*env)->GetStringUTFChars(env, path, 0); + + int result = initPlayer(pathStr); + + if (pathStr != 0) { + (*env)->ReleaseStringUTFChars(env, path, pathStr); + } + + return result; +} + +JNIEXPORT void Java_org_telegram_messenger_MediaController_closeOpusFile(JNIEnv *env, jclass class) { + cleanupPlayer(); +} + +JNIEXPORT int Java_org_telegram_messenger_MediaController_isOpusFile(JNIEnv *env, jclass class, jstring path) { + const char *pathStr = (*env)->GetStringUTFChars(env, path, 0); + + int result = 0; + + int error = OPUS_OK; + OggOpusFile *file = op_test_file(pathStr, &error); + if (file != NULL) { + int error = op_test_open(file); + op_free(file); + + result = error == OPUS_OK; + } + + if (pathStr != 0) { + (*env)->ReleaseStringUTFChars(env, path, pathStr); + } + + return result; +} diff --git a/TMessagesProj/jni/opus/celt/_kiss_fft_guts.h b/TMessagesProj/jni/opus/celt/_kiss_fft_guts.h new file mode 100644 index 00000000..aefe490e --- /dev/null +++ b/TMessagesProj/jni/opus/celt/_kiss_fft_guts.h @@ -0,0 +1,183 @@ +/*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/TMessagesProj/jni/opus/celt/arch.h b/TMessagesProj/jni/opus/celt/arch.h new file mode 100644 index 00000000..3bbcd366 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arch.h @@ -0,0 +1,214 @@ +/* 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/TMessagesProj/jni/opus/celt/arm/arm2gnu.pl b/TMessagesProj/jni/opus/celt/arm/arm2gnu.pl new file mode 100755 index 00000000..eab42efa --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/arm2gnu.pl @@ -0,0 +1,316 @@ +#!/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/TMessagesProj/jni/opus/celt/arm/arm_celt_map.c b/TMessagesProj/jni/opus/celt/arm/arm_celt_map.c new file mode 100644 index 00000000..547a84d1 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/arm_celt_map.c @@ -0,0 +1,49 @@ +/* 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/TMessagesProj/jni/opus/celt/arm/armcpu.c b/TMessagesProj/jni/opus/celt/arm/armcpu.c new file mode 100644 index 00000000..17685258 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/armcpu.c @@ -0,0 +1,174 @@ +/* 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/TMessagesProj/jni/opus/celt/arm/armcpu.h b/TMessagesProj/jni/opus/celt/arm/armcpu.h new file mode 100644 index 00000000..ac574460 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/armcpu.h @@ -0,0 +1,71 @@ +/* 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/TMessagesProj/jni/opus/celt/arm/armopts.s.in b/TMessagesProj/jni/opus/celt/arm/armopts.s.in new file mode 100644 index 00000000..3d8aaf27 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/armopts.s.in @@ -0,0 +1,37 @@ +/* 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/TMessagesProj/jni/opus/celt/arm/celt_pitch_xcorr_arm.s b/TMessagesProj/jni/opus/celt/arm/celt_pitch_xcorr_arm.s new file mode 100644 index 00000000..09917b16 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/celt_pitch_xcorr_arm.s @@ -0,0 +1,545 @@ +; 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/TMessagesProj/jni/opus/celt/arm/fixed_armv4.h b/TMessagesProj/jni/opus/celt/arm/fixed_armv4.h new file mode 100644 index 00000000..b690bc8c --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/fixed_armv4.h @@ -0,0 +1,76 @@ +/* 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/TMessagesProj/jni/opus/celt/arm/fixed_armv5e.h b/TMessagesProj/jni/opus/celt/arm/fixed_armv5e.h new file mode 100644 index 00000000..1194a7d3 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/fixed_armv5e.h @@ -0,0 +1,116 @@ +/* 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/TMessagesProj/jni/opus/celt/arm/kiss_fft_armv4.h b/TMessagesProj/jni/opus/celt/arm/kiss_fft_armv4.h new file mode 100644 index 00000000..e4faad6f --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/kiss_fft_armv4.h @@ -0,0 +1,121 @@ +/*Copyright (c) 2013, Xiph.Org Foundation and contributors. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE.*/ + +#ifndef KISS_FFT_ARMv4_H +#define KISS_FFT_ARMv4_H + +#if !defined(KISS_FFT_GUTS_H) +#error "This file should only be included from _kiss_fft_guts.h" +#endif + +#ifdef FIXED_POINT + +#undef C_MUL +#define C_MUL(m,a,b) \ + do{ \ + int br__; \ + int bi__; \ + int tt__; \ + __asm__ __volatile__( \ + "#C_MUL\n\t" \ + "ldrsh %[br], [%[bp], #0]\n\t" \ + "ldm %[ap], {r0,r1}\n\t" \ + "ldrsh %[bi], [%[bp], #2]\n\t" \ + "smull %[tt], %[mi], r1, %[br]\n\t" \ + "smlal %[tt], %[mi], r0, %[bi]\n\t" \ + "rsb %[bi], %[bi], #0\n\t" \ + "smull %[br], %[mr], r0, %[br]\n\t" \ + "mov %[tt], %[tt], lsr #15\n\t" \ + "smlal %[br], %[mr], r1, %[bi]\n\t" \ + "orr %[mi], %[tt], %[mi], lsl #17\n\t" \ + "mov %[br], %[br], lsr #15\n\t" \ + "orr %[mr], %[br], %[mr], lsl #17\n\t" \ + : [mr]"=r"((m).r), [mi]"=r"((m).i), \ + [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ + : [ap]"r"(&(a)), [bp]"r"(&(b)) \ + : "r0", "r1" \ + ); \ + } \ + while(0) + +#undef C_MUL4 +#define C_MUL4(m,a,b) \ + do{ \ + int br__; \ + int bi__; \ + int tt__; \ + __asm__ __volatile__( \ + "#C_MUL4\n\t" \ + "ldrsh %[br], [%[bp], #0]\n\t" \ + "ldm %[ap], {r0,r1}\n\t" \ + "ldrsh %[bi], [%[bp], #2]\n\t" \ + "smull %[tt], %[mi], r1, %[br]\n\t" \ + "smlal %[tt], %[mi], r0, %[bi]\n\t" \ + "rsb %[bi], %[bi], #0\n\t" \ + "smull %[br], %[mr], r0, %[br]\n\t" \ + "mov %[tt], %[tt], lsr #17\n\t" \ + "smlal %[br], %[mr], r1, %[bi]\n\t" \ + "orr %[mi], %[tt], %[mi], lsl #15\n\t" \ + "mov %[br], %[br], lsr #17\n\t" \ + "orr %[mr], %[br], %[mr], lsl #15\n\t" \ + : [mr]"=r"((m).r), [mi]"=r"((m).i), \ + [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ + : [ap]"r"(&(a)), [bp]"r"(&(b)) \ + : "r0", "r1" \ + ); \ + } \ + while(0) + +#undef C_MULC +#define C_MULC(m,a,b) \ + do{ \ + int br__; \ + int bi__; \ + int tt__; \ + __asm__ __volatile__( \ + "#C_MULC\n\t" \ + "ldrsh %[br], [%[bp], #0]\n\t" \ + "ldm %[ap], {r0,r1}\n\t" \ + "ldrsh %[bi], [%[bp], #2]\n\t" \ + "smull %[tt], %[mr], r0, %[br]\n\t" \ + "smlal %[tt], %[mr], r1, %[bi]\n\t" \ + "rsb %[bi], %[bi], #0\n\t" \ + "smull %[br], %[mi], r1, %[br]\n\t" \ + "mov %[tt], %[tt], lsr #15\n\t" \ + "smlal %[br], %[mi], r0, %[bi]\n\t" \ + "orr %[mr], %[tt], %[mr], lsl #17\n\t" \ + "mov %[br], %[br], lsr #15\n\t" \ + "orr %[mi], %[br], %[mi], lsl #17\n\t" \ + : [mr]"=r"((m).r), [mi]"=r"((m).i), \ + [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ + : [ap]"r"(&(a)), [bp]"r"(&(b)) \ + : "r0", "r1" \ + ); \ + } \ + while(0) + +#endif /* FIXED_POINT */ + +#endif /* KISS_FFT_ARMv4_H */ diff --git a/TMessagesProj/jni/opus/celt/arm/kiss_fft_armv5e.h b/TMessagesProj/jni/opus/celt/arm/kiss_fft_armv5e.h new file mode 100644 index 00000000..9eca183d --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/kiss_fft_armv5e.h @@ -0,0 +1,118 @@ +/*Copyright (c) 2013, Xiph.Org Foundation and contributors. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE.*/ + +#ifndef KISS_FFT_ARMv5E_H +#define KISS_FFT_ARMv5E_H + +#if !defined(KISS_FFT_GUTS_H) +#error "This file should only be included from _kiss_fft_guts.h" +#endif + +#ifdef FIXED_POINT + +#if defined(__thumb__)||defined(__thumb2__) +#define LDRD_CONS "Q" +#else +#define LDRD_CONS "Uq" +#endif + +#undef C_MUL +#define C_MUL(m,a,b) \ + do{ \ + int mr1__; \ + int mr2__; \ + int mi__; \ + long long aval__; \ + int bval__; \ + __asm__( \ + "#C_MUL\n\t" \ + "ldrd %[aval], %H[aval], %[ap]\n\t" \ + "ldr %[bval], %[bp]\n\t" \ + "smulwb %[mi], %H[aval], %[bval]\n\t" \ + "smulwb %[mr1], %[aval], %[bval]\n\t" \ + "smulwt %[mr2], %H[aval], %[bval]\n\t" \ + "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ + : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ + [aval]"=&r"(aval__), [bval]"=r"(bval__) \ + : [ap]LDRD_CONS(a), [bp]"m"(b) \ + ); \ + (m).r = SHL32(SUB32(mr1__, mr2__), 1); \ + (m).i = SHL32(mi__, 1); \ + } \ + while(0) + +#undef C_MUL4 +#define C_MUL4(m,a,b) \ + do{ \ + int mr1__; \ + int mr2__; \ + int mi__; \ + long long aval__; \ + int bval__; \ + __asm__( \ + "#C_MUL4\n\t" \ + "ldrd %[aval], %H[aval], %[ap]\n\t" \ + "ldr %[bval], %[bp]\n\t" \ + "smulwb %[mi], %H[aval], %[bval]\n\t" \ + "smulwb %[mr1], %[aval], %[bval]\n\t" \ + "smulwt %[mr2], %H[aval], %[bval]\n\t" \ + "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ + : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ + [aval]"=&r"(aval__), [bval]"=r"(bval__) \ + : [ap]LDRD_CONS(a), [bp]"m"(b) \ + ); \ + (m).r = SHR32(SUB32(mr1__, mr2__), 1); \ + (m).i = SHR32(mi__, 1); \ + } \ + while(0) + +#undef C_MULC +#define C_MULC(m,a,b) \ + do{ \ + int mr__; \ + int mi1__; \ + int mi2__; \ + long long aval__; \ + int bval__; \ + __asm__( \ + "#C_MULC\n\t" \ + "ldrd %[aval], %H[aval], %[ap]\n\t" \ + "ldr %[bval], %[bp]\n\t" \ + "smulwb %[mr], %[aval], %[bval]\n\t" \ + "smulwb %[mi1], %H[aval], %[bval]\n\t" \ + "smulwt %[mi2], %[aval], %[bval]\n\t" \ + "smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \ + : [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \ + [aval]"=&r"(aval__), [bval]"=r"(bval__) \ + : [ap]LDRD_CONS(a), [bp]"m"(b) \ + ); \ + (m).r = SHL32(mr__, 1); \ + (m).i = SHL32(SUB32(mi1__, mi2__), 1); \ + } \ + while(0) + +#endif /* FIXED_POINT */ + +#endif /* KISS_FFT_GUTS_H */ diff --git a/TMessagesProj/jni/opus/celt/arm/pitch_arm.h b/TMessagesProj/jni/opus/celt/arm/pitch_arm.h new file mode 100644 index 00000000..a07f8ac2 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/arm/pitch_arm.h @@ -0,0 +1,57 @@ +/* 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/TMessagesProj/jni/opus/celt/bands.c b/TMessagesProj/jni/opus/celt/bands.c new file mode 100644 index 00000000..cce56e2f --- /dev/null +++ b/TMessagesProj/jni/opus/celt/bands.c @@ -0,0 +1,1518 @@ +/* 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/TMessagesProj/jni/opus/celt/celt.h b/TMessagesProj/jni/opus/celt/celt.h new file mode 100644 index 00000000..5deea1f0 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/celt.h @@ -0,0 +1,218 @@ +/* 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 + + +#ifdef CUSTOM_MODES +#define OPUS_CUSTOM_NOSTATIC +#else +#define OPUS_CUSTOM_NOSTATIC static OPUS_INLINE +#endif + +static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0}; +/* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */ +static const unsigned char spread_icdf[4] = {25, 23, 2, 0}; + +static const unsigned char tapset_icdf[3]={2,1,0}; + +#ifdef CUSTOM_MODES +static const unsigned char toOpusTable[20] = { + 0xE0, 0xE8, 0xF0, 0xF8, + 0xC0, 0xC8, 0xD0, 0xD8, + 0xA0, 0xA8, 0xB0, 0xB8, + 0x00, 0x00, 0x00, 0x00, + 0x80, 0x88, 0x90, 0x98, +}; + +static const unsigned char fromOpusTable[16] = { + 0x80, 0x88, 0x90, 0x98, + 0x40, 0x48, 0x50, 0x58, + 0x20, 0x28, 0x30, 0x38, + 0x00, 0x08, 0x10, 0x18 +}; + +static OPUS_INLINE int toOpus(unsigned char c) +{ + int ret=0; + if (c<0xA0) + ret = toOpusTable[c>>3]; + if (ret == 0) + return -1; + else + return ret|(c&0x7); +} + +static OPUS_INLINE int fromOpus(unsigned char c) +{ + if (c<0x80) + return -1; + else + return fromOpusTable[(c>>3)-16] | (c&0x7); +} +#endif /* CUSTOM_MODES */ + +#define COMBFILTER_MAXPERIOD 1024 +#define COMBFILTER_MINPERIOD 15 + +extern const signed char tf_select_table[4][8]; + +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/TMessagesProj/jni/opus/celt/celt_decoder.c b/TMessagesProj/jni/opus/celt/celt_decoder.c new file mode 100644 index 00000000..830398ee --- /dev/null +++ b/TMessagesProj/jni/opus/celt/celt_decoder.c @@ -0,0 +1,1195 @@ +/* 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 */ +}; + +int celt_decoder_get_size(int channels) +{ + const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); + return opus_custom_decoder_get_size(mode, channels); +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels) +{ + int size = sizeof(struct CELTDecoder) + + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig) + + channels*LPC_ORDER*sizeof(opus_val16) + + 4*2*mode->nbEBands*sizeof(opus_val16); + return size; +} + +#ifdef CUSTOM_MODES +CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error) +{ + int ret; + CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels)); + ret = opus_custom_decoder_init(st, mode, channels); + if (ret != OPUS_OK) + { + opus_custom_decoder_destroy(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} +#endif /* CUSTOM_MODES */ + +int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels) +{ + int ret; + ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels); + if (ret != OPUS_OK) + return ret; + st->downsample = resampling_factor(sampling_rate); + if (st->downsample==0) + return OPUS_BAD_ARG; + else + return OPUS_OK; +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels) +{ + if (channels < 0 || channels > 2) + return OPUS_BAD_ARG; + + if (st==NULL) + return OPUS_ALLOC_FAIL; + + OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels)); + + st->mode = mode; + st->overlap = mode->overlap; + st->stream_channels = st->channels = channels; + + st->downsample = 1; + st->start = 0; + st->end = st->mode->effEBands; + st->signalling = 1; + st->arch = opus_select_arch(); + + st->loss_count = 0; + + opus_custom_decoder_ctl(st, OPUS_RESET_STATE); + + return OPUS_OK; +} + +#ifdef CUSTOM_MODES +void opus_custom_decoder_destroy(CELTDecoder *st) +{ + opus_free(st); +} +#endif /* CUSTOM_MODES */ + +static 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/TMessagesProj/jni/opus/celt/celt_encoder.c b/TMessagesProj/jni/opus/celt/celt_encoder.c new file mode 100644 index 00000000..ffff0775 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/celt_encoder.c @@ -0,0 +1,2353 @@ +/* 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 */ +}; + +int celt_encoder_get_size(int channels) +{ + CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); + return opus_custom_encoder_get_size(mode, channels); +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels) +{ + int size = sizeof(struct CELTEncoder) + + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */ + + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */ + + 3*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */ + /* opus_val16 oldLogE[channels*mode->nbEBands]; */ + /* opus_val16 oldLogE2[channels*mode->nbEBands]; */ + return size; +} + +#ifdef CUSTOM_MODES +CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error) +{ + int ret; + CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels)); + /* init will handle the NULL case */ + ret = opus_custom_encoder_init(st, mode, channels); + if (ret != OPUS_OK) + { + opus_custom_encoder_destroy(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} +#endif /* CUSTOM_MODES */ + +static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode, + int channels, int arch) +{ + if (channels < 0 || channels > 2) + return OPUS_BAD_ARG; + + if (st==NULL || mode==NULL) + return OPUS_ALLOC_FAIL; + + OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels)); + + st->mode = mode; + st->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/TMessagesProj/jni/opus/celt/celt_lpc.c b/TMessagesProj/jni/opus/celt/celt_lpc.c new file mode 100644 index 00000000..fa29d626 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/celt_lpc.c @@ -0,0 +1,309 @@ +/* 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/TMessagesProj/jni/opus/celt/celt_lpc.h b/TMessagesProj/jni/opus/celt/celt_lpc.h new file mode 100644 index 00000000..dc2a0a3d --- /dev/null +++ b/TMessagesProj/jni/opus/celt/celt_lpc.h @@ -0,0 +1,54 @@ +/* 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/TMessagesProj/jni/opus/celt/cpu_support.h b/TMessagesProj/jni/opus/celt/cpu_support.h new file mode 100644 index 00000000..d68dbe62 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/cpu_support.h @@ -0,0 +1,54 @@ +/* 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/TMessagesProj/jni/opus/celt/cwrs.c b/TMessagesProj/jni/opus/celt/cwrs.c new file mode 100644 index 00000000..ad980cc7 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/cwrs.c @@ -0,0 +1,697 @@ +/* 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/TMessagesProj/jni/opus/celt/cwrs.h b/TMessagesProj/jni/opus/celt/cwrs.h new file mode 100644 index 00000000..7dfbd076 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/cwrs.h @@ -0,0 +1,48 @@ +/* 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/TMessagesProj/jni/opus/celt/ecintrin.h b/TMessagesProj/jni/opus/celt/ecintrin.h new file mode 100644 index 00000000..2263cff6 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/ecintrin.h @@ -0,0 +1,87 @@ +/* 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/TMessagesProj/jni/opus/celt/entcode.c b/TMessagesProj/jni/opus/celt/entcode.c new file mode 100644 index 00000000..fa5d7c7c --- /dev/null +++ b/TMessagesProj/jni/opus/celt/entcode.c @@ -0,0 +1,93 @@ +/* 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/TMessagesProj/jni/opus/celt/entcode.h b/TMessagesProj/jni/opus/celt/entcode.h new file mode 100644 index 00000000..dd13e49e --- /dev/null +++ b/TMessagesProj/jni/opus/celt/entcode.h @@ -0,0 +1,117 @@ +/* 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/TMessagesProj/jni/opus/celt/entdec.c b/TMessagesProj/jni/opus/celt/entdec.c new file mode 100644 index 00000000..3c264685 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/entdec.c @@ -0,0 +1,245 @@ +/* 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/TMessagesProj/jni/opus/celt/entdec.h b/TMessagesProj/jni/opus/celt/entdec.h new file mode 100644 index 00000000..d8ab3187 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/entdec.h @@ -0,0 +1,100 @@ +/* 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/TMessagesProj/jni/opus/celt/entenc.c b/TMessagesProj/jni/opus/celt/entenc.c new file mode 100644 index 00000000..a7e34ece --- /dev/null +++ b/TMessagesProj/jni/opus/celt/entenc.c @@ -0,0 +1,294 @@ +/* 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/TMessagesProj/jni/opus/celt/entenc.h b/TMessagesProj/jni/opus/celt/entenc.h new file mode 100644 index 00000000..796bc4d5 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/entenc.h @@ -0,0 +1,110 @@ +/* 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/TMessagesProj/jni/opus/celt/fixed_debug.h b/TMessagesProj/jni/opus/celt/fixed_debug.h new file mode 100644 index 00000000..80bc9491 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/fixed_debug.h @@ -0,0 +1,773 @@ +/* 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/TMessagesProj/jni/opus/celt/fixed_generic.h b/TMessagesProj/jni/opus/celt/fixed_generic.h new file mode 100644 index 00000000..ecf018a2 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/fixed_generic.h @@ -0,0 +1,134 @@ +/* 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/TMessagesProj/jni/opus/celt/float_cast.h b/TMessagesProj/jni/opus/celt/float_cast.h new file mode 100644 index 00000000..ede65748 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/float_cast.h @@ -0,0 +1,140 @@ +/* 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/TMessagesProj/jni/opus/celt/kiss_fft.c b/TMessagesProj/jni/opus/celt/kiss_fft.c new file mode 100644 index 00000000..ad706c73 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/kiss_fft.c @@ -0,0 +1,719 @@ +/*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/TMessagesProj/jni/opus/celt/laplace.c b/TMessagesProj/jni/opus/celt/laplace.c new file mode 100644 index 00000000..a7bca874 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/laplace.c @@ -0,0 +1,134 @@ +/* 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/TMessagesProj/jni/opus/celt/mathops.h b/TMessagesProj/jni/opus/celt/mathops.h new file mode 100644 index 00000000..a0525a96 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/mathops.h @@ -0,0 +1,258 @@ +/* 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/TMessagesProj/jni/opus/celt/mdct.c b/TMessagesProj/jni/opus/celt/mdct.c new file mode 100644 index 00000000..90a214ad --- /dev/null +++ b/TMessagesProj/jni/opus/celt/mdct.c @@ -0,0 +1,311 @@ +/* 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/TMessagesProj/jni/opus/celt/modes.c b/TMessagesProj/jni/opus/celt/modes.c new file mode 100644 index 00000000..42e68e1c --- /dev/null +++ b/TMessagesProj/jni/opus/celt/modes.c @@ -0,0 +1,438 @@ +/* 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/TMessagesProj/jni/opus/celt/modes.h b/TMessagesProj/jni/opus/celt/modes.h new file mode 100644 index 00000000..c8340f98 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/modes.h @@ -0,0 +1,83 @@ +/* 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/TMessagesProj/jni/opus/celt/opus_custom_demo.c b/TMessagesProj/jni/opus/celt/opus_custom_demo.c new file mode 100644 index 00000000..ae41c0de --- /dev/null +++ b/TMessagesProj/jni/opus/celt/opus_custom_demo.c @@ -0,0 +1,210 @@ +/* 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/TMessagesProj/jni/opus/celt/os_support.h b/TMessagesProj/jni/opus/celt/os_support.h new file mode 100644 index 00000000..5e47e3cf --- /dev/null +++ b/TMessagesProj/jni/opus/celt/os_support.h @@ -0,0 +1,92 @@ +/* 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/TMessagesProj/jni/opus/celt/pitch.c b/TMessagesProj/jni/opus/celt/pitch.c new file mode 100644 index 00000000..d2b30544 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/pitch.c @@ -0,0 +1,537 @@ +/* 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/TMessagesProj/jni/opus/celt/quant_bands.h b/TMessagesProj/jni/opus/celt/quant_bands.h new file mode 100644 index 00000000..0490bca4 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/quant_bands.h @@ -0,0 +1,66 @@ +/* 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/TMessagesProj/jni/opus/celt/rate.c b/TMessagesProj/jni/opus/celt/rate.c new file mode 100644 index 00000000..e13d839d --- /dev/null +++ b/TMessagesProj/jni/opus/celt/rate.c @@ -0,0 +1,638 @@ +/* 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/TMessagesProj/jni/opus/celt/rate.h b/TMessagesProj/jni/opus/celt/rate.h new file mode 100644 index 00000000..f1e06611 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/rate.h @@ -0,0 +1,101 @@ +/* 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/TMessagesProj/jni/opus/celt/stack_alloc.h b/TMessagesProj/jni/opus/celt/stack_alloc.h new file mode 100644 index 00000000..316a6ce1 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/stack_alloc.h @@ -0,0 +1,178 @@ +/* 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/TMessagesProj/jni/opus/celt/static_modes_fixed.h b/TMessagesProj/jni/opus/celt/static_modes_fixed.h new file mode 100644 index 00000000..216df9e6 --- /dev/null +++ b/TMessagesProj/jni/opus/celt/static_modes_fixed.h @@ -0,0 +1,595 @@ +/* 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/TMessagesProj/jni/opus/celt/static_modes_float.h b/TMessagesProj/jni/opus/celt/static_modes_float.h new file mode 100644 index 00000000..5d7e7b8e --- /dev/null +++ b/TMessagesProj/jni/opus/celt/static_modes_float.h @@ -0,0 +1,599 @@ +/* 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/TMessagesProj/jni/opus/celt/vq.c b/TMessagesProj/jni/opus/celt/vq.c new file mode 100644 index 00000000..98a0f36c --- /dev/null +++ b/TMessagesProj/jni/opus/celt/vq.c @@ -0,0 +1,415 @@ +/* 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/TMessagesProj/jni/opus/include/opus_custom.h b/TMessagesProj/jni/opus/include/opus_custom.h new file mode 100644 index 00000000..41f36bf2 --- /dev/null +++ b/TMessagesProj/jni/opus/include/opus_custom.h @@ -0,0 +1,342 @@ +/* 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/TMessagesProj/jni/opus/include/opus_defines.h b/TMessagesProj/jni/opus/include/opus_defines.h new file mode 100644 index 00000000..265089f6 --- /dev/null +++ b/TMessagesProj/jni/opus/include/opus_defines.h @@ -0,0 +1,726 @@ +/* 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/TMessagesProj/jni/opus/include/opus_multistream.h b/TMessagesProj/jni/opus/include/opus_multistream.h new file mode 100644 index 00000000..ae599793 --- /dev/null +++ b/TMessagesProj/jni/opus/include/opus_multistream.h @@ -0,0 +1,660 @@ +/* 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/TMessagesProj/jni/opus/include/opus_types.h b/TMessagesProj/jni/opus/include/opus_types.h new file mode 100644 index 00000000..b28e03ae --- /dev/null +++ b/TMessagesProj/jni/opus/include/opus_types.h @@ -0,0 +1,159 @@ +/* (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/TMessagesProj/jni/opus/ogg/bitwise.c b/TMessagesProj/jni/opus/ogg/bitwise.c new file mode 100644 index 00000000..68aca675 --- /dev/null +++ b/TMessagesProj/jni/opus/ogg/bitwise.c @@ -0,0 +1,857 @@ +/******************************************************************** + * * + * 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-2010 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: packing variable sized words into an octet stream + last mod: $Id: bitwise.c 18051 2011-08-04 17:56:39Z 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; + bits-=bytes*8; + + if(b->endbit){ + int i; + /* unaligned copy. Do it the hard way. */ + for(i=0;iendbyte+bytes+1>=b->storage){ + void *ret; + if(!b->ptr) goto err; + if(b->endbyte+bytes+BUFFER_INCREMENT>b->storage) goto err; + b->storage=b->endbyte+bytes+BUFFER_INCREMENT; + ret=_ogg_realloc(b->buffer,b->storage); + if(!ret) goto err; + b->buffer=ret; + b->ptr=b->buffer+b->endbyte; + } + + memmove(b->ptr,source,bytes); + b->ptr+=bytes; + b->endbyte+=bytes; + *b->ptr=0; + + } + 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/TMessagesProj/jni/opus/ogg/ogg.h b/TMessagesProj/jni/opus/ogg/ogg.h new file mode 100644 index 00000000..cea4ebed --- /dev/null +++ b/TMessagesProj/jni/opus/ogg/ogg.h @@ -0,0 +1,210 @@ +/******************************************************************** + * * + * 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/TMessagesProj/jni/opus/ogg/os_types.h b/TMessagesProj/jni/opus/ogg/os_types.h new file mode 100644 index 00000000..d6691b70 --- /dev/null +++ b/TMessagesProj/jni/opus/ogg/os_types.h @@ -0,0 +1,147 @@ +/******************************************************************** + * * + * 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 17712 2010-12-03 17:10:02Z xiphmont $ + + ********************************************************************/ +#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 + +#endif + +#endif /* _OS_TYPES_H */ diff --git a/TMessagesProj/jni/opus/opusfile/info.c b/TMessagesProj/jni/opus/opusfile/info.c new file mode 100644 index 00000000..6cf98516 --- /dev/null +++ b/TMessagesProj/jni/opus/opusfile/info.c @@ -0,0 +1,683 @@ +/******************************************************************** + * * + * 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]|_data[1]<<8|_data[2]<<16|_data[3]<<24; +} + +static opus_uint32 op_parse_uint32be(const unsigned char *_data){ + return _data[3]|_data[2]<<8|_data[1]<<16|_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; + _tags->comment_lengths[ncomments]=tag_len+value_len+1; + memcpy(comment,_tag,sizeof(*comment)*tag_len); + comment[tag_len]='='; + memcpy(comment+tag_len+1,_value,sizeof(*comment)*(value_len+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; + 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/TMessagesProj/jni/opus/opusfile/internal.c b/TMessagesProj/jni/opus/opusfile/internal.c new file mode 100644 index 00000000..96c80def --- /dev/null +++ b/TMessagesProj/jni/opus/opusfile/internal.c @@ -0,0 +1,42 @@ +/******************************************************************** + * * + * 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/TMessagesProj/jni/opus/opusfile/internal.h b/TMessagesProj/jni/opus/opusfile/internal.h new file mode 100644 index 00000000..b1109deb --- /dev/null +++ b/TMessagesProj/jni/opus/opusfile/internal.h @@ -0,0 +1,249 @@ +/******************************************************************** + * * + * 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 "opusfile.h" + +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/TMessagesProj/jni/opus/opusfile/opusfile.c b/TMessagesProj/jni/opus/opusfile/opusfile.c new file mode 100644 index 00000000..392ddb29 --- /dev/null +++ b/TMessagesProj/jni/opus/opusfile/opusfile.c @@ -0,0 +1,3163 @@ +/******************************************************************** + * * + * 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); + /*If it's just a stream type we don't recognize, ignore it.*/ + if(ret==OP_ENOTFORMAT)continue; + /*Everything else is fatal.*/ + if(OP_UNLIKELY(ret<0))return ret; + /*Found a valid Opus header. + Continue setup.*/ + _of->ready_state=OP_STREAMSET; + } + } + /*Get the next page. + 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; + } + /*If this page also belongs to our Opus stream, submit it and break.*/ + if(_of->ready_state==OP_STREAMSET + &&_of->os.serialno==ogg_page_serialno(_og)){ + ogg_stream_pagein(&_of->os,_og); + break; + } + } + if(OP_UNLIKELY(_of->ready_state!=OP_STREAMSET))return OP_ENOTFORMAT; + /*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/TMessagesProj/jni/opus/opusfile/opusfile.h b/TMessagesProj/jni/opus/opusfile/opusfile.h new file mode 100644 index 00000000..ae58da98 --- /dev/null +++ b/TMessagesProj/jni/opus/opusfile/opusfile.h @@ -0,0 +1,2089 @@ +/******************************************************************** + * * + * 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 "opus_multistream.h" + +/**@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. + \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 for a given 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. + \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/TMessagesProj/jni/opus/opusfile/stream.c b/TMessagesProj/jni/opus/opusfile/stream.c new file mode 100644 index 00000000..0238a6b3 --- /dev/null +++ b/TMessagesProj/jni/opus/opusfile/stream.c @@ -0,0 +1,366 @@ +/******************************************************************** + * * + * 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/TMessagesProj/jni/opus/silk/A2NLSF.c b/TMessagesProj/jni/opus/silk/A2NLSF.c new file mode 100644 index 00000000..74b1b95d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/A2NLSF.c @@ -0,0 +1,252 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/API.h b/TMessagesProj/jni/opus/silk/API.h new file mode 100644 index 00000000..f0601bcf --- /dev/null +++ b/TMessagesProj/jni/opus/silk/API.h @@ -0,0 +1,133 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/CNG.c b/TMessagesProj/jni/opus/silk/CNG.c new file mode 100644 index 00000000..8481d95d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/CNG.c @@ -0,0 +1,172 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/HP_variable_cutoff.c b/TMessagesProj/jni/opus/silk/HP_variable_cutoff.c new file mode 100644 index 00000000..bbe10f04 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/HP_variable_cutoff.c @@ -0,0 +1,77 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/Inlines.h b/TMessagesProj/jni/opus/silk/Inlines.h new file mode 100644 index 00000000..ec986cdf --- /dev/null +++ b/TMessagesProj/jni/opus/silk/Inlines.h @@ -0,0 +1,188 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/LPC_analysis_filter.c b/TMessagesProj/jni/opus/silk/LPC_analysis_filter.c new file mode 100644 index 00000000..9d1f16cb --- /dev/null +++ b/TMessagesProj/jni/opus/silk/LPC_analysis_filter.c @@ -0,0 +1,106 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/LP_variable_cutoff.c b/TMessagesProj/jni/opus/silk/LP_variable_cutoff.c new file mode 100644 index 00000000..f639e1f8 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/LP_variable_cutoff.c @@ -0,0 +1,135 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/MacroCount.h b/TMessagesProj/jni/opus/silk/MacroCount.h new file mode 100644 index 00000000..834817d0 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/MacroCount.h @@ -0,0 +1,718 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/MacroDebug.h b/TMessagesProj/jni/opus/silk/MacroDebug.h new file mode 100644 index 00000000..35aedc5c --- /dev/null +++ b/TMessagesProj/jni/opus/silk/MacroDebug.h @@ -0,0 +1,952 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF2A.c b/TMessagesProj/jni/opus/silk/NLSF2A.c new file mode 100644 index 00000000..b1c559ea --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF2A.c @@ -0,0 +1,178 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF_VQ.c b/TMessagesProj/jni/opus/silk/NLSF_VQ.c new file mode 100644 index 00000000..69b6e22e --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF_VQ.c @@ -0,0 +1,68 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF_VQ_weights_laroia.c b/TMessagesProj/jni/opus/silk/NLSF_VQ_weights_laroia.c new file mode 100644 index 00000000..04894c59 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF_VQ_weights_laroia.c @@ -0,0 +1,80 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF_decode.c b/TMessagesProj/jni/opus/silk/NLSF_decode.c new file mode 100644 index 00000000..9f715060 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF_decode.c @@ -0,0 +1,101 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF_del_dec_quant.c b/TMessagesProj/jni/opus/silk/NLSF_del_dec_quant.c new file mode 100644 index 00000000..504dbbd0 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF_del_dec_quant.c @@ -0,0 +1,207 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF_encode.c b/TMessagesProj/jni/opus/silk/NLSF_encode.c new file mode 100644 index 00000000..03a036fd --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF_encode.c @@ -0,0 +1,136 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF_stabilize.c b/TMessagesProj/jni/opus/silk/NLSF_stabilize.c new file mode 100644 index 00000000..1fa1ea37 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF_stabilize.c @@ -0,0 +1,142 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NLSF_unpack.c b/TMessagesProj/jni/opus/silk/NLSF_unpack.c new file mode 100644 index 00000000..17bd23f7 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NLSF_unpack.c @@ -0,0 +1,55 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NSQ.c b/TMessagesProj/jni/opus/silk/NSQ.c new file mode 100644 index 00000000..cf5b3fd5 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NSQ.c @@ -0,0 +1,446 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/NSQ_del_dec.c b/TMessagesProj/jni/opus/silk/NSQ_del_dec.c new file mode 100644 index 00000000..522be406 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/NSQ_del_dec.c @@ -0,0 +1,719 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/PLC.c b/TMessagesProj/jni/opus/silk/PLC.c new file mode 100644 index 00000000..01f40014 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/PLC.c @@ -0,0 +1,423 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/PLC.h b/TMessagesProj/jni/opus/silk/PLC.h new file mode 100644 index 00000000..f1e2eccc --- /dev/null +++ b/TMessagesProj/jni/opus/silk/PLC.h @@ -0,0 +1,61 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/SigProc_FIX.h b/TMessagesProj/jni/opus/silk/SigProc_FIX.h new file mode 100644 index 00000000..1b580579 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/SigProc_FIX.h @@ -0,0 +1,594 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/VAD.c b/TMessagesProj/jni/opus/silk/VAD.c new file mode 100644 index 00000000..a8090981 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/VAD.c @@ -0,0 +1,357 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/VQ_WMat_EC.c b/TMessagesProj/jni/opus/silk/VQ_WMat_EC.c new file mode 100644 index 00000000..13d5d34e --- /dev/null +++ b/TMessagesProj/jni/opus/silk/VQ_WMat_EC.c @@ -0,0 +1,120 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/ana_filt_bank_1.c b/TMessagesProj/jni/opus/silk/ana_filt_bank_1.c new file mode 100644 index 00000000..24cfb03f --- /dev/null +++ b/TMessagesProj/jni/opus/silk/ana_filt_bank_1.c @@ -0,0 +1,74 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv4.h b/TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv4.h new file mode 100644 index 00000000..ff62b1e5 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv4.h @@ -0,0 +1,47 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv5e.h b/TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv5e.h new file mode 100644 index 00000000..617a09ca --- /dev/null +++ b/TMessagesProj/jni/opus/silk/arm/SigProc_FIX_armv5e.h @@ -0,0 +1,61 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/arm/macros_armv4.h b/TMessagesProj/jni/opus/silk/arm/macros_armv4.h new file mode 100644 index 00000000..3f30e972 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/arm/macros_armv4.h @@ -0,0 +1,103 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/arm/macros_armv5e.h b/TMessagesProj/jni/opus/silk/arm/macros_armv5e.h new file mode 100644 index 00000000..aad4117e --- /dev/null +++ b/TMessagesProj/jni/opus/silk/arm/macros_armv5e.h @@ -0,0 +1,213 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/biquad_alt.c b/TMessagesProj/jni/opus/silk/biquad_alt.c new file mode 100644 index 00000000..d55f5ee9 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/biquad_alt.c @@ -0,0 +1,78 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/bwexpander.c b/TMessagesProj/jni/opus/silk/bwexpander.c new file mode 100644 index 00000000..2eb44566 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/bwexpander.c @@ -0,0 +1,51 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/bwexpander_32.c b/TMessagesProj/jni/opus/silk/bwexpander_32.c new file mode 100644 index 00000000..d0010f73 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/bwexpander_32.c @@ -0,0 +1,50 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/check_control_input.c b/TMessagesProj/jni/opus/silk/check_control_input.c new file mode 100644 index 00000000..b5de9ce4 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/check_control_input.c @@ -0,0 +1,106 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/code_signs.c b/TMessagesProj/jni/opus/silk/code_signs.c new file mode 100644 index 00000000..0419ea26 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/code_signs.c @@ -0,0 +1,115 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/control.h b/TMessagesProj/jni/opus/silk/control.h new file mode 100644 index 00000000..747e5426 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/control.h @@ -0,0 +1,142 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/control_SNR.c b/TMessagesProj/jni/opus/silk/control_SNR.c new file mode 100644 index 00000000..f04e69fc --- /dev/null +++ b/TMessagesProj/jni/opus/silk/control_SNR.c @@ -0,0 +1,81 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/control_audio_bandwidth.c b/TMessagesProj/jni/opus/silk/control_audio_bandwidth.c new file mode 100644 index 00000000..4f9bc5cb --- /dev/null +++ b/TMessagesProj/jni/opus/silk/control_audio_bandwidth.c @@ -0,0 +1,126 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/control_codec.c b/TMessagesProj/jni/opus/silk/control_codec.c new file mode 100644 index 00000000..1f674bdd --- /dev/null +++ b/TMessagesProj/jni/opus/silk/control_codec.c @@ -0,0 +1,422 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/debug.c b/TMessagesProj/jni/opus/silk/debug.c new file mode 100644 index 00000000..9253faf7 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/debug.c @@ -0,0 +1,170 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/debug.h b/TMessagesProj/jni/opus/silk/debug.h new file mode 100644 index 00000000..efb6d3e9 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/debug.h @@ -0,0 +1,279 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/dec_API.c b/TMessagesProj/jni/opus/silk/dec_API.c new file mode 100644 index 00000000..4cbcf715 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/dec_API.c @@ -0,0 +1,397 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/decode_core.c b/TMessagesProj/jni/opus/silk/decode_core.c new file mode 100644 index 00000000..a820bf11 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/decode_core.c @@ -0,0 +1,238 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/decode_frame.c b/TMessagesProj/jni/opus/silk/decode_frame.c new file mode 100644 index 00000000..abc00a3d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/decode_frame.c @@ -0,0 +1,128 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/decode_indices.c b/TMessagesProj/jni/opus/silk/decode_indices.c new file mode 100644 index 00000000..7afe5c26 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/decode_indices.c @@ -0,0 +1,151 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/decode_parameters.c b/TMessagesProj/jni/opus/silk/decode_parameters.c new file mode 100644 index 00000000..e345b1dc --- /dev/null +++ b/TMessagesProj/jni/opus/silk/decode_parameters.c @@ -0,0 +1,115 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/decode_pitch.c b/TMessagesProj/jni/opus/silk/decode_pitch.c new file mode 100644 index 00000000..fedbc6a5 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/decode_pitch.c @@ -0,0 +1,77 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/decode_pulses.c b/TMessagesProj/jni/opus/silk/decode_pulses.c new file mode 100644 index 00000000..e8a87c2a --- /dev/null +++ b/TMessagesProj/jni/opus/silk/decode_pulses.c @@ -0,0 +1,115 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/decoder_set_fs.c b/TMessagesProj/jni/opus/silk/decoder_set_fs.c new file mode 100644 index 00000000..eef0fd25 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/decoder_set_fs.c @@ -0,0 +1,108 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/define.h b/TMessagesProj/jni/opus/silk/define.h new file mode 100644 index 00000000..c47aca9f --- /dev/null +++ b/TMessagesProj/jni/opus/silk/define.h @@ -0,0 +1,235 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/enc_API.c b/TMessagesProj/jni/opus/silk/enc_API.c new file mode 100644 index 00000000..43739efc --- /dev/null +++ b/TMessagesProj/jni/opus/silk/enc_API.c @@ -0,0 +1,556 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/encode_indices.c b/TMessagesProj/jni/opus/silk/encode_indices.c new file mode 100644 index 00000000..666c8c0b --- /dev/null +++ b/TMessagesProj/jni/opus/silk/encode_indices.c @@ -0,0 +1,181 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/encode_pulses.c b/TMessagesProj/jni/opus/silk/encode_pulses.c new file mode 100644 index 00000000..a4501438 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/encode_pulses.c @@ -0,0 +1,206 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/errors.h b/TMessagesProj/jni/opus/silk/errors.h new file mode 100644 index 00000000..45070800 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/errors.h @@ -0,0 +1,98 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/LTP_analysis_filter_FIX.c b/TMessagesProj/jni/opus/silk/fixed/LTP_analysis_filter_FIX.c new file mode 100644 index 00000000..a9419080 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/LTP_analysis_filter_FIX.c @@ -0,0 +1,85 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/LTP_scale_ctrl_FIX.c b/TMessagesProj/jni/opus/silk/fixed/LTP_scale_ctrl_FIX.c new file mode 100644 index 00000000..3dcedef8 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/LTP_scale_ctrl_FIX.c @@ -0,0 +1,53 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/apply_sine_window_FIX.c b/TMessagesProj/jni/opus/silk/fixed/apply_sine_window_FIX.c new file mode 100644 index 00000000..4502b713 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/apply_sine_window_FIX.c @@ -0,0 +1,101 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/autocorr_FIX.c b/TMessagesProj/jni/opus/silk/fixed/autocorr_FIX.c new file mode 100644 index 00000000..de95c986 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/autocorr_FIX.c @@ -0,0 +1,48 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/burg_modified_FIX.c b/TMessagesProj/jni/opus/silk/fixed/burg_modified_FIX.c new file mode 100644 index 00000000..db348295 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/burg_modified_FIX.c @@ -0,0 +1,279 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/corrMatrix_FIX.c b/TMessagesProj/jni/opus/silk/fixed/corrMatrix_FIX.c new file mode 100644 index 00000000..c6172705 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/corrMatrix_FIX.c @@ -0,0 +1,156 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/encode_frame_FIX.c b/TMessagesProj/jni/opus/silk/fixed/encode_frame_FIX.c new file mode 100644 index 00000000..b490986b --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/encode_frame_FIX.c @@ -0,0 +1,385 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/find_LPC_FIX.c b/TMessagesProj/jni/opus/silk/fixed/find_LPC_FIX.c new file mode 100644 index 00000000..783d32e2 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/find_LPC_FIX.c @@ -0,0 +1,151 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/find_LTP_FIX.c b/TMessagesProj/jni/opus/silk/fixed/find_LTP_FIX.c new file mode 100644 index 00000000..8c4d7037 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/find_LTP_FIX.c @@ -0,0 +1,244 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/find_pitch_lags_FIX.c b/TMessagesProj/jni/opus/silk/fixed/find_pitch_lags_FIX.c new file mode 100644 index 00000000..620f8dcd --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/find_pitch_lags_FIX.c @@ -0,0 +1,145 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/find_pred_coefs_FIX.c b/TMessagesProj/jni/opus/silk/fixed/find_pred_coefs_FIX.c new file mode 100644 index 00000000..5c22f828 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/find_pred_coefs_FIX.c @@ -0,0 +1,147 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/k2a_FIX.c b/TMessagesProj/jni/opus/silk/fixed/k2a_FIX.c new file mode 100644 index 00000000..5fee599b --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/k2a_FIX.c @@ -0,0 +1,53 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/k2a_Q16_FIX.c b/TMessagesProj/jni/opus/silk/fixed/k2a_Q16_FIX.c new file mode 100644 index 00000000..3b039875 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/k2a_Q16_FIX.c @@ -0,0 +1,53 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/main_FIX.h b/TMessagesProj/jni/opus/silk/fixed/main_FIX.h new file mode 100644 index 00000000..a56ca07a --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/main_FIX.h @@ -0,0 +1,257 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/noise_shape_analysis_FIX.c b/TMessagesProj/jni/opus/silk/fixed/noise_shape_analysis_FIX.c new file mode 100644 index 00000000..e24d2e9d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/noise_shape_analysis_FIX.c @@ -0,0 +1,445 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/pitch_analysis_core_FIX.c b/TMessagesProj/jni/opus/silk/fixed/pitch_analysis_core_FIX.c new file mode 100644 index 00000000..1641a0fb --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/pitch_analysis_core_FIX.c @@ -0,0 +1,744 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/prefilter_FIX.c b/TMessagesProj/jni/opus/silk/fixed/prefilter_FIX.c new file mode 100644 index 00000000..d381730c --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/prefilter_FIX.c @@ -0,0 +1,209 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/process_gains_FIX.c b/TMessagesProj/jni/opus/silk/fixed/process_gains_FIX.c new file mode 100644 index 00000000..05aba317 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/process_gains_FIX.c @@ -0,0 +1,117 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/regularize_correlations_FIX.c b/TMessagesProj/jni/opus/silk/fixed/regularize_correlations_FIX.c new file mode 100644 index 00000000..a2836b05 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/regularize_correlations_FIX.c @@ -0,0 +1,47 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/residual_energy16_FIX.c b/TMessagesProj/jni/opus/silk/fixed/residual_energy16_FIX.c new file mode 100644 index 00000000..ebffb2a6 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/residual_energy16_FIX.c @@ -0,0 +1,103 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/residual_energy_FIX.c b/TMessagesProj/jni/opus/silk/fixed/residual_energy_FIX.c new file mode 100644 index 00000000..105ae318 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/residual_energy_FIX.c @@ -0,0 +1,97 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/schur64_FIX.c b/TMessagesProj/jni/opus/silk/fixed/schur64_FIX.c new file mode 100644 index 00000000..764a10ef --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/schur64_FIX.c @@ -0,0 +1,92 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#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/TMessagesProj/jni/opus/silk/fixed/schur_FIX.c b/TMessagesProj/jni/opus/silk/fixed/schur_FIX.c new file mode 100644 index 00000000..c4c0ef23 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/schur_FIX.c @@ -0,0 +1,106 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/solve_LS_FIX.c b/TMessagesProj/jni/opus/silk/fixed/solve_LS_FIX.c new file mode 100644 index 00000000..51d7d49d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/solve_LS_FIX.c @@ -0,0 +1,249 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/structs_FIX.h b/TMessagesProj/jni/opus/silk/fixed/structs_FIX.h new file mode 100644 index 00000000..244b4793 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/structs_FIX.h @@ -0,0 +1,133 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/vector_ops_FIX.c b/TMessagesProj/jni/opus/silk/fixed/vector_ops_FIX.c new file mode 100644 index 00000000..509c8b35 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/vector_ops_FIX.c @@ -0,0 +1,96 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/fixed/warped_autocorrelation_FIX.c b/TMessagesProj/jni/opus/silk/fixed/warped_autocorrelation_FIX.c new file mode 100644 index 00000000..a4a579b1 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/fixed/warped_autocorrelation_FIX.c @@ -0,0 +1,88 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/LPC_analysis_filter_FLP.c b/TMessagesProj/jni/opus/silk/float/LPC_analysis_filter_FLP.c new file mode 100644 index 00000000..cae89a0a --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/LPC_analysis_filter_FLP.c @@ -0,0 +1,249 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/LPC_inv_pred_gain_FLP.c b/TMessagesProj/jni/opus/silk/float/LPC_inv_pred_gain_FLP.c new file mode 100644 index 00000000..25178bac --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/LPC_inv_pred_gain_FLP.c @@ -0,0 +1,76 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/LTP_analysis_filter_FLP.c b/TMessagesProj/jni/opus/silk/float/LTP_analysis_filter_FLP.c new file mode 100644 index 00000000..849b7c1c --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/LTP_analysis_filter_FLP.c @@ -0,0 +1,75 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/LTP_scale_ctrl_FLP.c b/TMessagesProj/jni/opus/silk/float/LTP_scale_ctrl_FLP.c new file mode 100644 index 00000000..8dbe29d0 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/LTP_scale_ctrl_FLP.c @@ -0,0 +1,52 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/SigProc_FLP.h b/TMessagesProj/jni/opus/silk/float/SigProc_FLP.h new file mode 100644 index 00000000..f0cb3733 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/SigProc_FLP.h @@ -0,0 +1,204 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/apply_sine_window_FLP.c b/TMessagesProj/jni/opus/silk/float/apply_sine_window_FLP.c new file mode 100644 index 00000000..6aae57c0 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/apply_sine_window_FLP.c @@ -0,0 +1,81 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/autocorrelation_FLP.c b/TMessagesProj/jni/opus/silk/float/autocorrelation_FLP.c new file mode 100644 index 00000000..8b8a9e65 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/autocorrelation_FLP.c @@ -0,0 +1,52 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/burg_modified_FLP.c b/TMessagesProj/jni/opus/silk/float/burg_modified_FLP.c new file mode 100644 index 00000000..ea5dc25a --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/burg_modified_FLP.c @@ -0,0 +1,186 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/bwexpander_FLP.c b/TMessagesProj/jni/opus/silk/float/bwexpander_FLP.c new file mode 100644 index 00000000..d55a4d79 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/bwexpander_FLP.c @@ -0,0 +1,49 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/corrMatrix_FLP.c b/TMessagesProj/jni/opus/silk/float/corrMatrix_FLP.c new file mode 100644 index 00000000..eae6a1cf --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/corrMatrix_FLP.c @@ -0,0 +1,93 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/encode_frame_FLP.c b/TMessagesProj/jni/opus/silk/float/encode_frame_FLP.c new file mode 100644 index 00000000..d54e2686 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/encode_frame_FLP.c @@ -0,0 +1,372 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/energy_FLP.c b/TMessagesProj/jni/opus/silk/float/energy_FLP.c new file mode 100644 index 00000000..24b8179f --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/energy_FLP.c @@ -0,0 +1,60 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#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/TMessagesProj/jni/opus/silk/float/find_LPC_FLP.c b/TMessagesProj/jni/opus/silk/float/find_LPC_FLP.c new file mode 100644 index 00000000..61c1ad95 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/find_LPC_FLP.c @@ -0,0 +1,104 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/find_LTP_FLP.c b/TMessagesProj/jni/opus/silk/float/find_LTP_FLP.c new file mode 100644 index 00000000..72299960 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/find_LTP_FLP.c @@ -0,0 +1,132 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_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/TMessagesProj/jni/opus/silk/float/find_pitch_lags_FLP.c b/TMessagesProj/jni/opus/silk/float/find_pitch_lags_FLP.c new file mode 100644 index 00000000..f3b22d25 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/find_pitch_lags_FLP.c @@ -0,0 +1,132 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#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/TMessagesProj/jni/opus/silk/float/find_pred_coefs_FLP.c b/TMessagesProj/jni/opus/silk/float/find_pred_coefs_FLP.c new file mode 100644 index 00000000..ea2c6c43 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/find_pred_coefs_FLP.c @@ -0,0 +1,117 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/inner_product_FLP.c b/TMessagesProj/jni/opus/silk/float/inner_product_FLP.c new file mode 100644 index 00000000..029c0129 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/inner_product_FLP.c @@ -0,0 +1,60 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#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/TMessagesProj/jni/opus/silk/float/k2a_FLP.c b/TMessagesProj/jni/opus/silk/float/k2a_FLP.c new file mode 100644 index 00000000..12af4e76 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/k2a_FLP.c @@ -0,0 +1,53 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/levinsondurbin_FLP.c b/TMessagesProj/jni/opus/silk/float/levinsondurbin_FLP.c new file mode 100644 index 00000000..f0ba6069 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/levinsondurbin_FLP.c @@ -0,0 +1,81 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/main_FLP.h b/TMessagesProj/jni/opus/silk/float/main_FLP.h new file mode 100644 index 00000000..fb553b61 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/main_FLP.h @@ -0,0 +1,312 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/noise_shape_analysis_FLP.c b/TMessagesProj/jni/opus/silk/float/noise_shape_analysis_FLP.c new file mode 100644 index 00000000..65f6ea58 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/noise_shape_analysis_FLP.c @@ -0,0 +1,365 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/pitch_analysis_core_FLP.c b/TMessagesProj/jni/opus/silk/float/pitch_analysis_core_FLP.c new file mode 100644 index 00000000..e58f041b --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/pitch_analysis_core_FLP.c @@ -0,0 +1,630 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/prefilter_FLP.c b/TMessagesProj/jni/opus/silk/float/prefilter_FLP.c new file mode 100644 index 00000000..8bc32fb4 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/prefilter_FLP.c @@ -0,0 +1,206 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/process_gains_FLP.c b/TMessagesProj/jni/opus/silk/float/process_gains_FLP.c new file mode 100644 index 00000000..c0da0dae --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/process_gains_FLP.c @@ -0,0 +1,103 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/regularize_correlations_FLP.c b/TMessagesProj/jni/opus/silk/float/regularize_correlations_FLP.c new file mode 100644 index 00000000..df461260 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/regularize_correlations_FLP.c @@ -0,0 +1,48 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/residual_energy_FLP.c b/TMessagesProj/jni/opus/silk/float/residual_energy_FLP.c new file mode 100644 index 00000000..b2e03a86 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/residual_energy_FLP.c @@ -0,0 +1,117 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/scale_copy_vector_FLP.c b/TMessagesProj/jni/opus/silk/float/scale_copy_vector_FLP.c new file mode 100644 index 00000000..20db32b3 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/scale_copy_vector_FLP.c @@ -0,0 +1,57 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/scale_vector_FLP.c b/TMessagesProj/jni/opus/silk/float/scale_vector_FLP.c new file mode 100644 index 00000000..108fdcbe --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/scale_vector_FLP.c @@ -0,0 +1,56 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/schur_FLP.c b/TMessagesProj/jni/opus/silk/float/schur_FLP.c new file mode 100644 index 00000000..ee436f83 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/schur_FLP.c @@ -0,0 +1,70 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/solve_LS_FLP.c b/TMessagesProj/jni/opus/silk/float/solve_LS_FLP.c new file mode 100644 index 00000000..7c90d665 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/solve_LS_FLP.c @@ -0,0 +1,207 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/sort_FLP.c b/TMessagesProj/jni/opus/silk/float/sort_FLP.c new file mode 100644 index 00000000..f08d7592 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/sort_FLP.c @@ -0,0 +1,83 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/structs_FLP.h b/TMessagesProj/jni/opus/silk/float/structs_FLP.h new file mode 100644 index 00000000..bb529e71 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/structs_FLP.h @@ -0,0 +1,131 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#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/TMessagesProj/jni/opus/silk/float/warped_autocorrelation_FLP.c b/TMessagesProj/jni/opus/silk/float/warped_autocorrelation_FLP.c new file mode 100644 index 00000000..542414f4 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/warped_autocorrelation_FLP.c @@ -0,0 +1,73 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/float/wrappers_FLP.c b/TMessagesProj/jni/opus/silk/float/wrappers_FLP.c new file mode 100644 index 00000000..350599b2 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/float/wrappers_FLP.c @@ -0,0 +1,201 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/gain_quant.c b/TMessagesProj/jni/opus/silk/gain_quant.c new file mode 100644 index 00000000..64ccd061 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/gain_quant.c @@ -0,0 +1,141 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/init_decoder.c b/TMessagesProj/jni/opus/silk/init_decoder.c new file mode 100644 index 00000000..f887c678 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/init_decoder.c @@ -0,0 +1,56 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/init_encoder.c b/TMessagesProj/jni/opus/silk/init_encoder.c new file mode 100644 index 00000000..65995c33 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/init_encoder.c @@ -0,0 +1,64 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#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/TMessagesProj/jni/opus/silk/inner_prod_aligned.c b/TMessagesProj/jni/opus/silk/inner_prod_aligned.c new file mode 100644 index 00000000..257ae9e0 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/inner_prod_aligned.c @@ -0,0 +1,47 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/interpolate.c b/TMessagesProj/jni/opus/silk/interpolate.c new file mode 100644 index 00000000..1bd8ca4d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/interpolate.c @@ -0,0 +1,51 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/lin2log.c b/TMessagesProj/jni/opus/silk/lin2log.c new file mode 100644 index 00000000..d4fe5153 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/lin2log.c @@ -0,0 +1,46 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/log2lin.c b/TMessagesProj/jni/opus/silk/log2lin.c new file mode 100644 index 00000000..a692e009 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/log2lin.c @@ -0,0 +1,58 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/macros.h b/TMessagesProj/jni/opus/silk/macros.h new file mode 100644 index 00000000..a84e5a5d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/macros.h @@ -0,0 +1,115 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/main.h b/TMessagesProj/jni/opus/silk/main.h new file mode 100644 index 00000000..2bdf8978 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/main.h @@ -0,0 +1,438 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/pitch_est_defines.h b/TMessagesProj/jni/opus/silk/pitch_est_defines.h new file mode 100644 index 00000000..e1e4b5d7 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/pitch_est_defines.h @@ -0,0 +1,88 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/pitch_est_tables.c b/TMessagesProj/jni/opus/silk/pitch_est_tables.c new file mode 100644 index 00000000..81a8baca --- /dev/null +++ b/TMessagesProj/jni/opus/silk/pitch_est_tables.c @@ -0,0 +1,99 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "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/TMessagesProj/jni/opus/silk/process_NLSFs.c b/TMessagesProj/jni/opus/silk/process_NLSFs.c new file mode 100644 index 00000000..c27cf030 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/process_NLSFs.c @@ -0,0 +1,105 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/quant_LTP_gains.c b/TMessagesProj/jni/opus/silk/quant_LTP_gains.c new file mode 100644 index 00000000..fd0870da --- /dev/null +++ b/TMessagesProj/jni/opus/silk/quant_LTP_gains.c @@ -0,0 +1,128 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler.c b/TMessagesProj/jni/opus/silk/resampler.c new file mode 100644 index 00000000..374fbb37 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler.c @@ -0,0 +1,215 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_down2.c b/TMessagesProj/jni/opus/silk/resampler_down2.c new file mode 100644 index 00000000..cec36346 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_down2.c @@ -0,0 +1,74 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_down2_3.c b/TMessagesProj/jni/opus/silk/resampler_down2_3.c new file mode 100644 index 00000000..4342614d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_down2_3.c @@ -0,0 +1,103 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_private.h b/TMessagesProj/jni/opus/silk/resampler_private.h new file mode 100644 index 00000000..422a7d9d --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_private.h @@ -0,0 +1,88 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_private_AR2.c b/TMessagesProj/jni/opus/silk/resampler_private_AR2.c new file mode 100644 index 00000000..5fff2371 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_private_AR2.c @@ -0,0 +1,55 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_private_IIR_FIR.c b/TMessagesProj/jni/opus/silk/resampler_private_IIR_FIR.c new file mode 100644 index 00000000..6b2b3a2e --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_private_IIR_FIR.c @@ -0,0 +1,107 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_private_down_FIR.c b/TMessagesProj/jni/opus/silk/resampler_private_down_FIR.c new file mode 100644 index 00000000..783e42b3 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_private_down_FIR.c @@ -0,0 +1,194 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_private_up2_HQ.c b/TMessagesProj/jni/opus/silk/resampler_private_up2_HQ.c new file mode 100644 index 00000000..c7ec8de3 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_private_up2_HQ.c @@ -0,0 +1,113 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "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/TMessagesProj/jni/opus/silk/resampler_rom.c b/TMessagesProj/jni/opus/silk/resampler_rom.c new file mode 100644 index 00000000..2d502706 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_rom.c @@ -0,0 +1,96 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_rom.h b/TMessagesProj/jni/opus/silk/resampler_rom.h new file mode 100644 index 00000000..490b3388 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_rom.h @@ -0,0 +1,68 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/resampler_structs.h b/TMessagesProj/jni/opus/silk/resampler_structs.h new file mode 100644 index 00000000..9e9457d1 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/resampler_structs.h @@ -0,0 +1,60 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_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/TMessagesProj/jni/opus/silk/shell_coder.c b/TMessagesProj/jni/opus/silk/shell_coder.c new file mode 100644 index 00000000..796f57d6 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/shell_coder.c @@ -0,0 +1,151 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/sigm_Q15.c b/TMessagesProj/jni/opus/silk/sigm_Q15.c new file mode 100644 index 00000000..3c507d25 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/sigm_Q15.c @@ -0,0 +1,76 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/sort.c b/TMessagesProj/jni/opus/silk/sort.c new file mode 100644 index 00000000..8670dbdd --- /dev/null +++ b/TMessagesProj/jni/opus/silk/sort.c @@ -0,0 +1,154 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/stereo_LR_to_MS.c b/TMessagesProj/jni/opus/silk/stereo_LR_to_MS.c new file mode 100644 index 00000000..42906e6f --- /dev/null +++ b/TMessagesProj/jni/opus/silk/stereo_LR_to_MS.c @@ -0,0 +1,229 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/stereo_MS_to_LR.c b/TMessagesProj/jni/opus/silk/stereo_MS_to_LR.c new file mode 100644 index 00000000..62521a4f --- /dev/null +++ b/TMessagesProj/jni/opus/silk/stereo_MS_to_LR.c @@ -0,0 +1,85 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/stereo_decode_pred.c b/TMessagesProj/jni/opus/silk/stereo_decode_pred.c new file mode 100644 index 00000000..56ba3925 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/stereo_decode_pred.c @@ -0,0 +1,73 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/stereo_encode_pred.c b/TMessagesProj/jni/opus/silk/stereo_encode_pred.c new file mode 100644 index 00000000..e6dd1950 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/stereo_encode_pred.c @@ -0,0 +1,62 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/stereo_find_predictor.c b/TMessagesProj/jni/opus/silk/stereo_find_predictor.c new file mode 100644 index 00000000..e30e90bd --- /dev/null +++ b/TMessagesProj/jni/opus/silk/stereo_find_predictor.c @@ -0,0 +1,79 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/stereo_quant_pred.c b/TMessagesProj/jni/opus/silk/stereo_quant_pred.c new file mode 100644 index 00000000..d4ced6c3 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/stereo_quant_pred.c @@ -0,0 +1,73 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/structs.h b/TMessagesProj/jni/opus/silk/structs.h new file mode 100644 index 00000000..1826b36a --- /dev/null +++ b/TMessagesProj/jni/opus/silk/structs.h @@ -0,0 +1,327 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/sum_sqr_shift.c b/TMessagesProj/jni/opus/silk/sum_sqr_shift.c new file mode 100644 index 00000000..12514c99 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/sum_sqr_shift.c @@ -0,0 +1,85 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/table_LSF_cos.c b/TMessagesProj/jni/opus/silk/table_LSF_cos.c new file mode 100644 index 00000000..ec9dc639 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/table_LSF_cos.c @@ -0,0 +1,70 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables.h b/TMessagesProj/jni/opus/silk/tables.h new file mode 100644 index 00000000..a91431e8 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables.h @@ -0,0 +1,122 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables_LTP.c b/TMessagesProj/jni/opus/silk/tables_LTP.c new file mode 100644 index 00000000..0e6a0254 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables_LTP.c @@ -0,0 +1,296 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables_NLSF_CB_NB_MB.c b/TMessagesProj/jni/opus/silk/tables_NLSF_CB_NB_MB.c new file mode 100644 index 00000000..8c59d207 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables_NLSF_CB_NB_MB.c @@ -0,0 +1,159 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables_NLSF_CB_WB.c b/TMessagesProj/jni/opus/silk/tables_NLSF_CB_WB.c new file mode 100644 index 00000000..50af87eb --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables_NLSF_CB_WB.c @@ -0,0 +1,198 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables_gain.c b/TMessagesProj/jni/opus/silk/tables_gain.c new file mode 100644 index 00000000..37e41d89 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables_gain.c @@ -0,0 +1,63 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables_other.c b/TMessagesProj/jni/opus/silk/tables_other.c new file mode 100644 index 00000000..398686bf --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables_other.c @@ -0,0 +1,138 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables_pitch_lag.c b/TMessagesProj/jni/opus/silk/tables_pitch_lag.c new file mode 100644 index 00000000..e80cc59a --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables_pitch_lag.c @@ -0,0 +1,69 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tables_pulses_per_block.c b/TMessagesProj/jni/opus/silk/tables_pulses_per_block.c new file mode 100644 index 00000000..c7c01c88 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tables_pulses_per_block.c @@ -0,0 +1,264 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/tuning_parameters.h b/TMessagesProj/jni/opus/silk/tuning_parameters.h new file mode 100644 index 00000000..e1057bba --- /dev/null +++ b/TMessagesProj/jni/opus/silk/tuning_parameters.h @@ -0,0 +1,171 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/silk/typedef.h b/TMessagesProj/jni/opus/silk/typedef.h new file mode 100644 index 00000000..97b7e709 --- /dev/null +++ b/TMessagesProj/jni/opus/silk/typedef.h @@ -0,0 +1,78 @@ +/*********************************************************************** +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/TMessagesProj/jni/opus/src/analysis.c b/TMessagesProj/jni/opus/src/analysis.c new file mode 100644 index 00000000..778a62aa --- /dev/null +++ b/TMessagesProj/jni/opus/src/analysis.c @@ -0,0 +1,645 @@ +/* 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/TMessagesProj/jni/opus/src/analysis.h b/TMessagesProj/jni/opus/src/analysis.h new file mode 100644 index 00000000..be0388fa --- /dev/null +++ b/TMessagesProj/jni/opus/src/analysis.h @@ -0,0 +1,90 @@ +/* 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/TMessagesProj/jni/opus/src/mlp.c b/TMessagesProj/jni/opus/src/mlp.c new file mode 100644 index 00000000..46386026 --- /dev/null +++ b/TMessagesProj/jni/opus/src/mlp.c @@ -0,0 +1,140 @@ +/* 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/TMessagesProj/jni/opus/src/mlp.h b/TMessagesProj/jni/opus/src/mlp.h new file mode 100644 index 00000000..86c8e061 --- /dev/null +++ b/TMessagesProj/jni/opus/src/mlp.h @@ -0,0 +1,41 @@ +/* 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/TMessagesProj/jni/opus/src/mlp_data.c b/TMessagesProj/jni/opus/src/mlp_data.c new file mode 100644 index 00000000..401c4c02 --- /dev/null +++ b/TMessagesProj/jni/opus/src/mlp_data.c @@ -0,0 +1,105 @@ +/* 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/TMessagesProj/jni/opus/src/opus.c b/TMessagesProj/jni/opus/src/opus.c new file mode 100644 index 00000000..30890b9c --- /dev/null +++ b/TMessagesProj/jni/opus/src/opus.c @@ -0,0 +1,329 @@ +/* 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/TMessagesProj/jni/opus/src/opus_decoder.c b/TMessagesProj/jni/opus/src/opus_decoder.c new file mode 100644 index 00000000..919ba521 --- /dev/null +++ b/TMessagesProj/jni/opus/src/opus_decoder.c @@ -0,0 +1,970 @@ +/* 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/TMessagesProj/jni/opus/src/opus_encoder.c b/TMessagesProj/jni/opus/src/opus_encoder.c new file mode 100644 index 00000000..fbd3de63 --- /dev/null +++ b/TMessagesProj/jni/opus/src/opus_encoder.c @@ -0,0 +1,2488 @@ +/* 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/TMessagesProj/jni/opus/src/opus_multistream.c b/TMessagesProj/jni/opus/src/opus_multistream.c new file mode 100644 index 00000000..09c3639b --- /dev/null +++ b/TMessagesProj/jni/opus/src/opus_multistream.c @@ -0,0 +1,92 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "opus_multistream.h" +#include "opus.h" +#include "opus_private.h" +#include "stack_alloc.h" +#include +#include "float_cast.h" +#include "os_support.h" + + +int validate_layout(const ChannelLayout *layout) +{ + int i, max_channel; + + max_channel = layout->nb_streams+layout->nb_coupled_streams; + if (max_channel>255) + return 0; + for (i=0;inb_channels;i++) + { + if (layout->mapping[i] >= max_channel && layout->mapping[i] != 255) + return 0; + } + return 1; +} + + +int get_left_channel(const ChannelLayout *layout, int stream_id, int prev) +{ + int i; + i = (prev<0) ? 0 : prev+1; + for (;inb_channels;i++) + { + if (layout->mapping[i]==stream_id*2) + return i; + } + return -1; +} + +int get_right_channel(const ChannelLayout *layout, int stream_id, int prev) +{ + int i; + i = (prev<0) ? 0 : prev+1; + for (;inb_channels;i++) + { + if (layout->mapping[i]==stream_id*2+1) + return i; + } + return -1; +} + +int get_mono_channel(const ChannelLayout *layout, int stream_id, int prev) +{ + int i; + i = (prev<0) ? 0 : prev+1; + for (;inb_channels;i++) + { + if (layout->mapping[i]==stream_id+layout->nb_coupled_streams) + return i; + } + return -1; +} + diff --git a/TMessagesProj/jni/opus/src/opus_multistream_decoder.c b/TMessagesProj/jni/opus/src/opus_multistream_decoder.c new file mode 100644 index 00000000..a05fa1e7 --- /dev/null +++ b/TMessagesProj/jni/opus/src/opus_multistream_decoder.c @@ -0,0 +1,537 @@ +/* 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/TMessagesProj/jni/opus/src/opus_multistream_encoder.c b/TMessagesProj/jni/opus/src/opus_multistream_encoder.c new file mode 100644 index 00000000..49e27913 --- /dev/null +++ b/TMessagesProj/jni/opus/src/opus_multistream_encoder.c @@ -0,0 +1,1174 @@ +/* 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/TMessagesProj/jni/opus/src/opus_private.h b/TMessagesProj/jni/opus/src/opus_private.h new file mode 100644 index 00000000..83225f2b --- /dev/null +++ b/TMessagesProj/jni/opus/src/opus_private.h @@ -0,0 +1,129 @@ +/* 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/TMessagesProj/jni/opus/src/repacketizer.c b/TMessagesProj/jni/opus/src/repacketizer.c new file mode 100644 index 00000000..a62675ce --- /dev/null +++ b/TMessagesProj/jni/opus/src/repacketizer.c @@ -0,0 +1,345 @@ +/* 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/TMessagesProj/jni/opus/src/tansig_table.h b/TMessagesProj/jni/opus/src/tansig_table.h new file mode 100644 index 00000000..c76f844a --- /dev/null +++ b/TMessagesProj/jni/opus/src/tansig_table.h @@ -0,0 +1,45 @@ +/* This file is auto-generated by gen_tables */ + +static const float tansig_table[201] = { +0.000000f, 0.039979f, 0.079830f, 0.119427f, 0.158649f, +0.197375f, 0.235496f, 0.272905f, 0.309507f, 0.345214f, +0.379949f, 0.413644f, 0.446244f, 0.477700f, 0.507977f, +0.537050f, 0.564900f, 0.591519f, 0.616909f, 0.641077f, +0.664037f, 0.685809f, 0.706419f, 0.725897f, 0.744277f, +0.761594f, 0.777888f, 0.793199f, 0.807569f, 0.821040f, +0.833655f, 0.845456f, 0.856485f, 0.866784f, 0.876393f, +0.885352f, 0.893698f, 0.901468f, 0.908698f, 0.915420f, +0.921669f, 0.927473f, 0.932862f, 0.937863f, 0.942503f, +0.946806f, 0.950795f, 0.954492f, 0.957917f, 0.961090f, +0.964028f, 0.966747f, 0.969265f, 0.971594f, 0.973749f, +0.975743f, 0.977587f, 0.979293f, 0.980869f, 0.982327f, +0.983675f, 0.984921f, 0.986072f, 0.987136f, 0.988119f, +0.989027f, 0.989867f, 0.990642f, 0.991359f, 0.992020f, +0.992631f, 0.993196f, 0.993718f, 0.994199f, 0.994644f, +0.995055f, 0.995434f, 0.995784f, 0.996108f, 0.996407f, +0.996682f, 0.996937f, 0.997172f, 0.997389f, 0.997590f, +0.997775f, 0.997946f, 0.998104f, 0.998249f, 0.998384f, +0.998508f, 0.998623f, 0.998728f, 0.998826f, 0.998916f, +0.999000f, 0.999076f, 0.999147f, 0.999213f, 0.999273f, +0.999329f, 0.999381f, 0.999428f, 0.999472f, 0.999513f, +0.999550f, 0.999585f, 0.999617f, 0.999646f, 0.999673f, +0.999699f, 0.999722f, 0.999743f, 0.999763f, 0.999781f, +0.999798f, 0.999813f, 0.999828f, 0.999841f, 0.999853f, +0.999865f, 0.999875f, 0.999885f, 0.999893f, 0.999902f, +0.999909f, 0.999916f, 0.999923f, 0.999929f, 0.999934f, +0.999939f, 0.999944f, 0.999948f, 0.999952f, 0.999956f, +0.999959f, 0.999962f, 0.999965f, 0.999968f, 0.999970f, +0.999973f, 0.999975f, 0.999977f, 0.999978f, 0.999980f, +0.999982f, 0.999983f, 0.999984f, 0.999986f, 0.999987f, +0.999988f, 0.999989f, 0.999990f, 0.999990f, 0.999991f, +0.999992f, 0.999992f, 0.999993f, 0.999994f, 0.999994f, +0.999994f, 0.999995f, 0.999995f, 0.999996f, 0.999996f, +0.999996f, 0.999997f, 0.999997f, 0.999997f, 0.999997f, +0.999997f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, +0.999998f, 0.999998f, 0.999999f, 0.999999f, 0.999999f, +0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, +0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, +1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, +1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, +1.000000f, +}; diff --git a/TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c b/TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c index 5955a7fe..bd115f1a 100755 --- a/TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c +++ b/TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c @@ -1,9 +1,12 @@ +#include +#include #include "org_telegram_SQLite.h" jfieldID queryArgsCountField; jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv* env = 0; + srand(time(NULL)); if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { return -1; diff --git a/TMessagesProj/jni/sqlite3.c b/TMessagesProj/jni/sqlite3.c index d0a1ec23..7c6d3e28 100644 --- a/TMessagesProj/jni/sqlite3.c +++ b/TMessagesProj/jni/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.8.3.1. By combining all the individual C code files into this +** version 3.8.4.1. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -19,15 +19,99 @@ */ #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 -#define SQLITE_ENABLE_FTS3 1 -#define SQLITE_ENABLE_FTS3_PARENTHESIS 1 - #ifndef SQLITE_PRIVATE # define SQLITE_PRIVATE static #endif #ifndef SQLITE_API # define SQLITE_API #endif +/************** Begin file sqliteInt.h ***************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Internal interface definitions for SQLite. +** +*/ +#ifndef _SQLITEINT_H_ +#define _SQLITEINT_H_ + +/* +** These #defines should enable >2GB file support on POSIX if the +** underlying operating system supports it. If the OS lacks +** large file support, or if the OS is windows, these should be no-ops. +** +** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any +** system #includes. Hence, this block of code must be the very first +** code in all source files. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: Red Hat 7.2) but you want your code to work +** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in Red Hat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +** +** The previous paragraph was written in 2005. (This paragraph is written +** on 2008-11-28.) These days, all Linux kernels support large files, so +** you should probably leave LFS enabled. But some embedded platforms might +** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful. +** +** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +/* +** For MinGW, check to see if we can include the header file containing its +** version information, among other things. Normally, this internal MinGW +** header file would [only] be included automatically by other MinGW header +** files; however, the contained version information is now required by this +** header file to work around binary compatibility issues (see below) and +** this is the only known way to reliably obtain it. This entire #if block +** would be completely unnecessary if there was any other way of detecting +** MinGW via their preprocessor (e.g. if they customized their GCC to define +** some MinGW-specific macros). When compiling for MinGW, either the +** _HAVE_MINGW_H or _HAVE__MINGW_H (note the extra underscore) macro must be +** defined; otherwise, detection of conditions specific to MinGW will be +** disabled. +*/ +#if defined(_HAVE_MINGW_H) +# include "mingw.h" +#elif defined(_HAVE__MINGW_H) +# include "_mingw.h" +#endif + +/* +** For MinGW version 4.x (and higher), check to see if the _USE_32BIT_TIME_T +** define is required to maintain binary compatibility with the MSVC runtime +** library in use (e.g. for Windows XP). +*/ +#if !defined(_USE_32BIT_TIME_T) && !defined(_USE_64BIT_TIME_T) && \ + defined(_WIN32) && !defined(_WIN64) && \ + defined(__MINGW_MAJOR_VERSION) && __MINGW_MAJOR_VERSION >= 4 && \ + defined(__MSVCRT__) +# define _USE_32BIT_TIME_T +#endif + +/* The public SQLite interface. The _FILE_OFFSET_BITS macro must appear +** first in QNX. Also, the _USE_32BIT_TIME_T macro must appear first for +** MinGW. +*/ +/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ /************** Begin file sqlite3.h *****************************************/ /* ** 2001 September 15 @@ -138,9 +222,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.8.3.1" -#define SQLITE_VERSION_NUMBER 3008003 -#define SQLITE_SOURCE_ID "2014-02-11 14:52:19 ea3317a4803d71d88183b29f1d3086f46d68a00e" +#define SQLITE_VERSION "3.8.4.1" +#define SQLITE_VERSION_NUMBER 3008004 +#define SQLITE_SOURCE_ID "2014-03-11 15:27:36 018d317b1257ce68a92908b05c9c7cf1494050d0" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -6153,7 +6237,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 #define SQLITE_TESTCTRL_NEVER_CORRUPT 20 -#define SQLITE_TESTCTRL_LAST 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_LAST 21 /* ** CAPI3REF: SQLite Runtime Status @@ -7416,50 +7501,7 @@ struct sqlite3_rtree_geometry { /************** End of sqlite3.h *********************************************/ -/************** Begin file sqliteInt.h ***************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Internal interface definitions for SQLite. -** -*/ -#ifndef _SQLITEINT_H_ -#define _SQLITEINT_H_ - -/* -** These #defines should enable >2GB file support on POSIX if the -** underlying operating system supports it. If the OS lacks -** large file support, or if the OS is windows, these should be no-ops. -** -** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any -** system #includes. Hence, this block of code must be the very first -** code in all source files. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: Red Hat 7.2) but you want your code to work -** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in Red Hat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -** -** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif +/************** Continuing where we left off in sqliteInt.h ******************/ /* ** Include the configuration header output by 'configure' if we're using the @@ -8846,8 +8888,6 @@ SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, u32 *pAmt); SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, u32 *pAmt); SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, u32 *pSize); SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); -SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64); -SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*); SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); @@ -8987,9 +9027,12 @@ struct VdbeOp { char *zComment; /* Comment to improve readability */ #endif #ifdef VDBE_PROFILE - int cnt; /* Number of times this instruction was executed */ + u32 cnt; /* Number of times this instruction was executed */ u64 cycles; /* Total time spent executing this instruction */ #endif +#ifdef SQLITE_VDBE_COVERAGE + int iSrcLine; /* Source-code line that generated this opcode */ +#endif }; typedef struct VdbeOp VdbeOp; @@ -9099,62 +9142,62 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Gosub 17 #define OP_Return 18 #define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ -#define OP_Yield 20 -#define OP_HaltIfNull 21 /* synopsis: if r[P3] null then halt */ -#define OP_Halt 22 -#define OP_Integer 23 /* synopsis: r[P2]=P1 */ -#define OP_Int64 24 /* synopsis: r[P2]=P4 */ -#define OP_String 25 /* synopsis: r[P2]='P4' (len=P1) */ -#define OP_Null 26 /* synopsis: r[P2..P3]=NULL */ -#define OP_Blob 27 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 28 /* synopsis: r[P2]=parameter(P1,P4) */ -#define OP_Move 29 /* synopsis: r[P2@P3]=r[P1@P3] */ -#define OP_Copy 30 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ -#define OP_SCopy 31 /* synopsis: r[P2]=r[P1] */ -#define OP_ResultRow 32 /* synopsis: output=r[P1@P2] */ -#define OP_CollSeq 33 -#define OP_AddImm 34 /* synopsis: r[P1]=r[P1]+P2 */ -#define OP_MustBeInt 35 -#define OP_RealAffinity 36 -#define OP_Permutation 37 -#define OP_Compare 38 -#define OP_Jump 39 -#define OP_Once 40 -#define OP_If 41 -#define OP_IfNot 42 -#define OP_Column 43 /* synopsis: r[P3]=PX */ -#define OP_Affinity 44 /* synopsis: affinity(r[P1@P2]) */ -#define OP_MakeRecord 45 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_Count 46 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 47 -#define OP_SetCookie 48 -#define OP_VerifyCookie 49 -#define OP_OpenRead 50 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenWrite 51 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenAutoindex 52 /* synopsis: nColumn=P2 */ -#define OP_OpenEphemeral 53 /* synopsis: nColumn=P2 */ -#define OP_SorterOpen 54 -#define OP_OpenPseudo 55 /* synopsis: content in r[P2@P3] */ -#define OP_Close 56 -#define OP_SeekLt 57 /* synopsis: key=r[P3@P4] */ -#define OP_SeekLe 58 /* synopsis: key=r[P3@P4] */ -#define OP_SeekGe 59 /* synopsis: key=r[P3@P4] */ -#define OP_SeekGt 60 /* synopsis: key=r[P3@P4] */ -#define OP_Seek 61 /* synopsis: intkey=r[P2] */ -#define OP_NoConflict 62 /* synopsis: key=r[P3@P4] */ -#define OP_NotFound 63 /* synopsis: key=r[P3@P4] */ -#define OP_Found 64 /* synopsis: key=r[P3@P4] */ -#define OP_NotExists 65 /* synopsis: intkey=r[P3] */ -#define OP_Sequence 66 /* synopsis: r[P2]=rowid */ -#define OP_NewRowid 67 /* synopsis: r[P2]=rowid */ -#define OP_Insert 68 /* synopsis: intkey=r[P3] data=r[P2] */ -#define OP_InsertInt 69 /* synopsis: intkey=P3 data=r[P2] */ -#define OP_Delete 70 +#define OP_InitCoroutine 20 +#define OP_EndCoroutine 21 +#define OP_Yield 22 +#define OP_HaltIfNull 23 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 24 +#define OP_Integer 25 /* synopsis: r[P2]=P1 */ +#define OP_Int64 26 /* synopsis: r[P2]=P4 */ +#define OP_String 27 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_Null 28 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 29 /* synopsis: r[P1]=NULL */ +#define OP_Blob 30 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 31 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 32 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 33 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 34 /* synopsis: r[P2]=r[P1] */ +#define OP_ResultRow 35 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 36 +#define OP_AddImm 37 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_MustBeInt 38 +#define OP_RealAffinity 39 +#define OP_Permutation 40 +#define OP_Compare 41 +#define OP_Jump 42 +#define OP_Once 43 +#define OP_If 44 +#define OP_IfNot 45 +#define OP_Column 46 /* synopsis: r[P3]=PX */ +#define OP_Affinity 47 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 48 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 49 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 50 +#define OP_SetCookie 51 +#define OP_OpenRead 52 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenWrite 53 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenAutoindex 54 /* synopsis: nColumn=P2 */ +#define OP_OpenEphemeral 55 /* synopsis: nColumn=P2 */ +#define OP_SorterOpen 56 +#define OP_OpenPseudo 57 /* synopsis: P3 columns in r[P2] */ +#define OP_Close 58 +#define OP_SeekLT 59 +#define OP_SeekLE 60 +#define OP_SeekGE 61 +#define OP_SeekGT 62 +#define OP_Seek 63 /* synopsis: intkey=r[P2] */ +#define OP_NoConflict 64 /* synopsis: key=r[P3@P4] */ +#define OP_NotFound 65 /* synopsis: key=r[P3@P4] */ +#define OP_Found 66 /* synopsis: key=r[P3@P4] */ +#define OP_NotExists 67 /* synopsis: intkey=r[P3] */ +#define OP_Sequence 68 /* synopsis: r[P2]=rowid */ +#define OP_NewRowid 69 /* synopsis: r[P2]=rowid */ +#define OP_Insert 70 /* synopsis: intkey=r[P3] data=r[P2] */ #define OP_Or 71 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ #define OP_And 72 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ -#define OP_ResetCount 73 -#define OP_SorterCompare 74 /* synopsis: if key(P1)!=rtrim(r[P3],P4) goto P2 */ -#define OP_SorterData 75 /* synopsis: r[P2]=data */ +#define OP_InsertInt 73 /* synopsis: intkey=P3 data=r[P2] */ +#define OP_Delete 74 +#define OP_ResetCount 75 #define OP_IsNull 76 /* same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ #define OP_NotNull 77 /* same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ #define OP_Ne 78 /* same as TK_NE, synopsis: if r[P1]!=r[P3] goto P2 */ @@ -9163,7 +9206,7 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Le 81 /* same as TK_LE, synopsis: if r[P1]<=r[P3] goto P2 */ #define OP_Lt 82 /* same as TK_LT, synopsis: if r[P1]=r[P3] goto P2 */ -#define OP_RowKey 84 /* synopsis: r[P2]=key */ +#define OP_SorterCompare 84 /* synopsis: if key(P1)!=rtrim(r[P3],P4) goto P2 */ #define OP_BitAnd 85 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ #define OP_BitOr 86 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ #define OP_ShiftLeft 87 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<0 goto P2 */ -#define OP_IfNeg 129 /* synopsis: if r[P1]<0 goto P2 */ -#define OP_IfZero 130 /* synopsis: r[P1]+=P3, if r[P1]==0 goto P2 */ -#define OP_AggFinal 131 /* synopsis: accum=r[P1] N=P2 */ -#define OP_IncrVacuum 132 +#define OP_RowKey 98 /* synopsis: r[P2]=key */ +#define OP_RowData 99 /* synopsis: r[P2]=data */ +#define OP_Rowid 100 /* synopsis: r[P2]=rowid */ +#define OP_NullRow 101 +#define OP_Last 102 +#define OP_SorterSort 103 +#define OP_Sort 104 +#define OP_Rewind 105 +#define OP_SorterInsert 106 +#define OP_IdxInsert 107 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 108 /* synopsis: key=r[P2@P3] */ +#define OP_IdxRowid 109 /* synopsis: r[P2]=rowid */ +#define OP_IdxLE 110 /* synopsis: key=r[P3@P4] */ +#define OP_IdxGT 111 /* synopsis: key=r[P3@P4] */ +#define OP_IdxLT 112 /* synopsis: key=r[P3@P4] */ +#define OP_IdxGE 113 /* synopsis: key=r[P3@P4] */ +#define OP_Destroy 114 +#define OP_Clear 115 +#define OP_CreateIndex 116 /* synopsis: r[P2]=root iDb=P1 */ +#define OP_CreateTable 117 /* synopsis: r[P2]=root iDb=P1 */ +#define OP_ParseSchema 118 +#define OP_LoadAnalysis 119 +#define OP_DropTable 120 +#define OP_DropIndex 121 +#define OP_DropTrigger 122 +#define OP_IntegrityCk 123 +#define OP_RowSetAdd 124 /* synopsis: rowset(P1)=r[P2] */ +#define OP_RowSetRead 125 /* synopsis: r[P3]=rowset(P1) */ +#define OP_RowSetTest 126 /* synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_Program 127 +#define OP_Param 128 +#define OP_FkCounter 129 /* synopsis: fkctr[P1]+=P2 */ +#define OP_FkIfZero 130 /* synopsis: if fkctr[P1]==0 goto P2 */ +#define OP_MemMax 131 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_IfPos 132 /* synopsis: if r[P1]>0 goto P2 */ #define OP_Real 133 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ -#define OP_Expire 134 -#define OP_TableLock 135 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 136 -#define OP_VCreate 137 -#define OP_VDestroy 138 -#define OP_VOpen 139 -#define OP_VColumn 140 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VNext 141 -#define OP_VRename 142 +#define OP_IfNeg 134 /* synopsis: if r[P1]<0 goto P2 */ +#define OP_IfZero 135 /* synopsis: r[P1]+=P3, if r[P1]==0 goto P2 */ +#define OP_AggFinal 136 /* synopsis: accum=r[P1] N=P2 */ +#define OP_IncrVacuum 137 +#define OP_Expire 138 +#define OP_TableLock 139 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 140 +#define OP_VCreate 141 +#define OP_VDestroy 142 #define OP_ToText 143 /* same as TK_TO_TEXT */ #define OP_ToBlob 144 /* same as TK_TO_BLOB */ #define OP_ToNumeric 145 /* same as TK_TO_NUMERIC */ #define OP_ToInt 146 /* same as TK_TO_INT */ #define OP_ToReal 147 /* same as TK_TO_REAL */ -#define OP_Pagecount 148 -#define OP_MaxPgcnt 149 -#define OP_Trace 150 -#define OP_Noop 151 -#define OP_Explain 152 +#define OP_VOpen 148 +#define OP_VColumn 149 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VNext 150 +#define OP_VRename 151 +#define OP_Pagecount 152 +#define OP_MaxPgcnt 153 +#define OP_Init 154 /* synopsis: Start at P2 */ +#define OP_Noop 155 +#define OP_Explain 156 /* Properties such as "out2" or "jump" that are specified in @@ -9248,24 +9295,24 @@ typedef struct VdbeOpList VdbeOpList; #define OPFLG_INITIALIZER {\ /* 0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,\ /* 8 */ 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00,\ -/* 16 */ 0x01, 0x01, 0x04, 0x24, 0x04, 0x10, 0x00, 0x02,\ -/* 24 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x20,\ -/* 32 */ 0x00, 0x00, 0x04, 0x05, 0x04, 0x00, 0x00, 0x01,\ -/* 40 */ 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x02,\ -/* 48 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 56 */ 0x00, 0x11, 0x11, 0x11, 0x11, 0x08, 0x11, 0x11,\ -/* 64 */ 0x11, 0x11, 0x02, 0x02, 0x00, 0x00, 0x00, 0x4c,\ +/* 16 */ 0x01, 0x01, 0x04, 0x24, 0x01, 0x04, 0x05, 0x10,\ +/* 24 */ 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,\ +/* 32 */ 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x05, 0x04,\ +/* 40 */ 0x00, 0x00, 0x01, 0x01, 0x05, 0x05, 0x00, 0x00,\ +/* 48 */ 0x00, 0x02, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00,\ +/* 56 */ 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x08,\ +/* 64 */ 0x11, 0x11, 0x11, 0x11, 0x02, 0x02, 0x00, 0x4c,\ /* 72 */ 0x4c, 0x00, 0x00, 0x00, 0x05, 0x05, 0x15, 0x15,\ /* 80 */ 0x15, 0x15, 0x15, 0x15, 0x00, 0x4c, 0x4c, 0x4c,\ /* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x00,\ -/* 96 */ 0x24, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01,\ -/* 104 */ 0x08, 0x08, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00,\ -/* 112 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 120 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01, 0x08,\ -/* 128 */ 0x05, 0x05, 0x05, 0x00, 0x01, 0x02, 0x00, 0x00,\ -/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04,\ -/* 144 */ 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x00, 0x00,\ -/* 152 */ 0x00,} +/* 96 */ 0x24, 0x02, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01,\ +/* 104 */ 0x01, 0x01, 0x08, 0x08, 0x00, 0x02, 0x01, 0x01,\ +/* 112 */ 0x01, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,\ +/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x45, 0x15, 0x01,\ +/* 128 */ 0x02, 0x00, 0x01, 0x08, 0x05, 0x02, 0x05, 0x05,\ +/* 136 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,\ +/* 144 */ 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x01, 0x00,\ +/* 152 */ 0x02, 0x02, 0x01, 0x00, 0x00,} /************** End of opcodes.h *********************************************/ /************** Continuing where we left off in vdbe.h ***********************/ @@ -9281,7 +9328,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); +SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno); SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); @@ -9322,9 +9369,12 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); #endif SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); -SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,const UnpackedRecord*,int); SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo *, char *, int, char **); +typedef int (*RecordCompare)(int,const void*,const UnpackedRecord*,int); +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); + #ifndef SQLITE_OMIT_TRIGGER SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); #endif @@ -9352,6 +9402,43 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); # define VdbeModuleComment(X) #endif +/* +** The VdbeCoverage macros are used to set a coverage testing point +** for VDBE branch instructions. The coverage testing points are line +** numbers in the sqlite3.c source file. VDBE branch coverage testing +** only works with an amalagmation build. That's ok since a VDBE branch +** coverage build designed for testing the test suite only. No application +** should ever ship with VDBE branch coverage measuring turned on. +** +** VdbeCoverage(v) // Mark the previously coded instruction +** // as a branch +** +** VdbeCoverageIf(v, conditional) // Mark previous if conditional true +** +** VdbeCoverageAlwaysTaken(v) // Previous branch is always taken +** +** VdbeCoverageNeverTaken(v) // Previous branch is never taken +** +** Every VDBE branch operation must be tagged with one of the macros above. +** If not, then when "make test" is run with -DSQLITE_VDBE_COVERAGE and +** -DSQLITE_DEBUG then an ALWAYS() will fail in the vdbeTakeBranch() +** routine in vdbe.c, alerting the developer to the missed tag. +*/ +#ifdef SQLITE_VDBE_COVERAGE +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe*,int); +# define VdbeCoverage(v) sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageIf(v,x) if(x)sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageAlwaysTaken(v) sqlite3VdbeSetLineNumber(v,2); +# define VdbeCoverageNeverTaken(v) sqlite3VdbeSetLineNumber(v,1); +# define VDBE_OFFSET_LINENO(x) (__LINE__+x) +#else +# define VdbeCoverage(v) +# define VdbeCoverageIf(v,x) +# define VdbeCoverageAlwaysTaken(v) +# define VdbeCoverageNeverTaken(v) +# define VDBE_OFFSET_LINENO(x) 0 +#endif + #endif /************** End of vdbe.h ************************************************/ @@ -10409,8 +10496,7 @@ struct sqlite3 { ** Return true if it OK to factor constant expressions into the initialization ** code. The argument is a Parse object for the code generator. */ -#define ConstFactorOk(P) \ - ((P)->cookieGoto>0 && OptimizationEnabled((P)->db,SQLITE_FactorOutConst)) +#define ConstFactorOk(P) ((P)->okConstFactor) /* ** Possible values for the sqlite.magic field. @@ -10636,10 +10722,16 @@ struct CollSeq { /* ** Additional bit values that can be ORed with an affinity without ** changing the affinity. +** +** The SQLITE_NOTNULL flag is a combination of NULLEQ and JUMPIFNULL. +** It causes an assert() to fire if either operand to a comparison +** operator is NULL. It is added to certain comparison operators to +** prove that the operands are always NOT NULL. */ #define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */ #define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */ #define SQLITE_NULLEQ 0x80 /* NULL=NULL */ +#define SQLITE_NOTNULL 0x88 /* Assert that operands are never NULL */ /* ** An object of this type is created for each virtual table present in @@ -10898,19 +10990,19 @@ struct KeyInfo { ** ** This structure holds a record that has already been disassembled ** into its constituent fields. +** +** The r1 and r2 member variables are only used by the optimized comparison +** functions vdbeRecordCompareInt() and vdbeRecordCompareString(). */ struct UnpackedRecord { KeyInfo *pKeyInfo; /* Collation and sort-order information */ u16 nField; /* Number of entries in apMem[] */ - u8 flags; /* Boolean settings. UNPACKED_... below */ + i8 default_rc; /* Comparison result if keys are equal */ Mem *aMem; /* Values */ + int r1; /* Value to return if (lhs > rhs) */ + int r2; /* Value to return if (rhs < lhs) */ }; -/* -** Allowed values of UnpackedRecord.flags -*/ -#define UNPACKED_INCRKEY 0x01 /* Make this key an epsilon larger */ -#define UNPACKED_PREFIX_MATCH 0x02 /* A prefix match is considered OK */ /* ** Each SQL index is represented in memory by an @@ -11330,8 +11422,8 @@ typedef u64 Bitmask; ** contains more than 63 columns and the 64-th or later column is used. */ struct SrcList { - u8 nSrc; /* Number of tables or subqueries in the FROM clause */ - u8 nAlloc; /* Number of entries allocated in a[] below */ + int nSrc; /* Number of tables or subqueries in the FROM clause */ + u32 nAlloc; /* Number of entries allocated in a[] below */ struct SrcList_item { Schema *pSchema; /* Schema to which this item is fixed */ char *zDatabase; /* Name of database holding this table */ @@ -11341,6 +11433,7 @@ struct SrcList { Select *pSelect; /* A SELECT statement used in place of a table name */ int addrFillSub; /* Address of subroutine to manifest a subquery */ int regReturn; /* Register holding return address of addrFillSub */ + int regResult; /* Registers holding results of a co-routine */ u8 jointype; /* Type of join between this able and the previous */ unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ unsigned isCorrelated :1; /* True if sub-query is correlated */ @@ -11469,7 +11562,6 @@ struct Select { ExprList *pOrderBy; /* The ORDER BY clause */ Select *pPrior; /* Prior select in a compound select statement */ Select *pNext; /* Next select to the left in a compound */ - Select *pRightmost; /* Right-most select in a compound select statement */ Expr *pLimit; /* LIMIT expression. NULL means not used. */ Expr *pOffset; /* OFFSET expression. NULL means not used. */ With *pWith; /* WITH clause attached to this select. Or NULL. */ @@ -11487,10 +11579,11 @@ struct Select { #define SF_HasTypeInfo 0x0020 /* FROM subqueries have Table metadata */ #define SF_UseSorter 0x0040 /* Sort using a sorter */ #define SF_Values 0x0080 /* Synthesized from VALUES clause */ -#define SF_Materialize 0x0100 /* Force materialization of views */ +#define SF_Materialize 0x0100 /* NOT USED */ #define SF_NestedFrom 0x0200 /* Part of a parenthesized FROM clause */ #define SF_MaybeConvert 0x0400 /* Need convertCompoundSelectToSubquery() */ #define SF_Recursive 0x0800 /* The recursive part of a recursive CTE */ +#define SF_Compound 0x1000 /* Part of a compound query */ /* @@ -11669,12 +11762,12 @@ struct Parse { u8 checkSchema; /* Causes schema cookie check after an error */ u8 nested; /* Number of nested calls to the parser/code generator */ u8 nTempReg; /* Number of temporary registers in aTempReg[] */ - u8 nTempInUse; /* Number of aTempReg[] currently checked out */ u8 nColCache; /* Number of entries in aColCache[] */ u8 iColCache; /* Next entry in aColCache[] to replace */ u8 isMultiWrite; /* True if statement may modify/insert multiple rows */ u8 mayAbort; /* True if statement may throw an ABORT exception */ u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ + u8 okConstFactor; /* OK to factor out constants */ int aTempReg[8]; /* Holding area for temporary registers */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ @@ -11684,30 +11777,29 @@ struct Parse { int nSet; /* Number of sets used so far */ int nOnce; /* Number of OP_Once instructions so far */ int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ - int nLabel; /* Number of labels used */ - int *aLabel; /* Space to hold the labels */ int iFixedOp; /* Never back out opcodes iFixedOp-1 or earlier */ int ckBase; /* Base register of data during check constraints */ int iPartIdxTab; /* Table corresponding to a partial index */ int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ int iCacheCnt; /* Counter used to generate aColCache[].lru values */ + int nLabel; /* Number of labels used */ + int *aLabel; /* Space to hold the labels */ struct yColCache { int iTable; /* Table cursor number */ - int iColumn; /* Table column number */ + i16 iColumn; /* Table column number */ u8 tempReg; /* iReg is a temp register that needs to be freed */ int iLevel; /* Nesting level */ int iReg; /* Reg with value of this column. 0 means none. */ int lru; /* Least recently used entry has the smallest value */ } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */ ExprList *pConstExpr;/* Constant expressions */ + Token constraintName;/* Name of the constraint currently being parsed */ yDbMask writeMask; /* Start a write transaction on these databases */ yDbMask cookieMask; /* Bitmask of schema verified databases */ - int cookieGoto; /* Address of OP_Goto to cookie verifier subroutine */ int cookieValue[SQLITE_MAX_ATTACHED+2]; /* Values of cookies to verify */ int regRowid; /* Register holding rowid of CREATE TABLE entry */ int regRoot; /* Register holding root page number for new objects */ int nMaxArg; /* Max args passed to user function by sub-program */ - Token constraintName;/* Name of the constraint currently being parsed */ #ifndef SQLITE_OMIT_SHARED_CACHE int nTableLock; /* Number of locks in aTableLock */ TableLock *aTableLock; /* Required table locks for shared-cache mode */ @@ -11726,12 +11818,17 @@ struct Parse { u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ u8 disableTriggers; /* True to disable triggers */ - /* Above is constant between recursions. Below is reset before and after - ** each recursion */ + /************************************************************************ + ** Above is constant between recursions. Below is reset before and after + ** each recursion. The boundary between these two regions is determined + ** using offsetof(Parse,nVar) so the nVar field must be the first field + ** in the recursive region. + ************************************************************************/ int nVar; /* Number of '?' variables seen in the SQL so far */ int nzVar; /* Number of available slots in azVar[] */ u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */ + u8 bFreeWith; /* True if pWith should be freed with parser */ u8 explain; /* True if the EXPLAIN flag is found on the query */ #ifndef SQLITE_OMIT_VIRTUALTABLE u8 declareVtab; /* True if inside sqlite3_declare_vtab() */ @@ -11758,7 +11855,6 @@ struct Parse { Table *pZombieTab; /* List of Table objects to delete after code gen */ TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ With *pWith; /* Current WITH clause, or NULL */ - u8 bFreeWith; /* True if pWith should be freed with parser */ }; /* @@ -11974,6 +12070,13 @@ struct Sqlite3Config { void(*xSqllog)(void*,sqlite3*,const char*, int); void *pSqllogArg; #endif +#ifdef SQLITE_VDBE_COVERAGE + /* The following callback (if not NULL) is invoked on every VDBE branch + ** operation. Set the callback using SQLITE_TESTCTRL_VDBE_COVERAGE. + */ + void (*xVdbeBranch)(void*,int iSrcLine,u8 eThis,u8 eMx); /* Callback */ + void *pVdbeBranchArg; /* 1st argument */ +#endif }; /* @@ -12307,7 +12410,6 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse); # define sqlite3AutoincrementBegin(X) # define sqlite3AutoincrementEnd(X) #endif -SQLITE_PRIVATE int sqlite3CodeCoroutine(Parse*, Select*, SelectDest*); SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int); SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*); @@ -12355,11 +12457,12 @@ SQLITE_PRIVATE void sqlite3ExprCachePop(Parse*, int); SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int, int); SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse*); SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse*, int, int); -SQLITE_PRIVATE int sqlite3ExprCode(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); SQLITE_PRIVATE void sqlite3ExprCodeAtInit(Parse*, Expr*, int, u8); SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*); SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int); -SQLITE_PRIVATE int sqlite3ExprCodeAndCache(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, u8); #define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ #define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ @@ -12397,7 +12500,6 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*); SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*); SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); -SQLITE_PRIVATE void sqlite3ExprCodeIsNullJump(Vdbe*, const Expr*, int, int); SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); SQLITE_PRIVATE int sqlite3IsRowid(const char*); SQLITE_PRIVATE void sqlite3GenerateRowDelete(Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8); @@ -12541,7 +12643,7 @@ SQLITE_PRIVATE int sqlite3VarintLen(u64 v); SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *, Index *); -SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *, Table *); +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int); SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2); SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity); SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr); @@ -13354,6 +13456,9 @@ static const char * const azCompileOpt[] = { #ifdef SQLITE_OMIT_COMPOUND_SELECT "OMIT_COMPOUND_SELECT", #endif +#ifdef SQLITE_OMIT_CTE + "OMIT_CTE", +#endif #ifdef SQLITE_OMIT_DATETIME_FUNCS "OMIT_DATETIME_FUNCS", #endif @@ -13645,7 +13750,6 @@ struct VdbeCursor { Bool useRandomRowid:1;/* Generate new record numbers semi-randomly */ Bool isTable:1; /* True if a table requiring integer keys */ Bool isOrdered:1; /* True if the underlying table is BTREE_UNORDERED */ - Bool multiPseudo:1; /* Multi-register pseudo-cursor */ sqlite3_vtab_cursor *pVtabCursor; /* The cursor for a virtual table */ i64 seqCount; /* Sequence counter */ i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ @@ -13739,7 +13843,6 @@ struct Mem { } u; int n; /* Number of characters in string value, excluding '\0' */ u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ - u8 type; /* One of SQLITE_NULL, SQLITE_TEXT, SQLITE_INTEGER, etc */ u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ #ifdef SQLITE_DEBUG Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ @@ -13766,9 +13869,10 @@ struct Mem { #define MEM_Int 0x0004 /* Value is an integer */ #define MEM_Real 0x0008 /* Value is a real number */ #define MEM_Blob 0x0010 /* Value is a BLOB */ +#define MEM_AffMask 0x001f /* Mask of affinity bits */ #define MEM_RowSet 0x0020 /* Value is a RowSet object */ #define MEM_Frame 0x0040 /* Value is a VdbeFrame object */ -#define MEM_Invalid 0x0080 /* Value is undefined */ +#define MEM_Undefined 0x0080 /* Value is undefined */ #define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ #define MEM_TypeMask 0x01ff /* Mask of type bits */ @@ -13779,7 +13883,7 @@ struct Mem { ** string is \000 or \u0000 terminated */ #define MEM_Term 0x0200 /* String rep is nul terminated */ -#define MEM_Dyn 0x0400 /* Need to call sqliteFree() on Mem.z */ +#define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */ #define MEM_Static 0x0800 /* Mem.z points to a static string */ #define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */ #define MEM_Agg 0x2000 /* Mem.z points to an agg function context */ @@ -13800,7 +13904,7 @@ struct Mem { ** is for use inside assert() statements only. */ #ifdef SQLITE_DEBUG -#define memIsValid(M) ((M)->flags & MEM_Invalid)==0 +#define memIsValid(M) ((M)->flags & MEM_Undefined)==0 #endif /* @@ -13962,7 +14066,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); -SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(VdbeCursor*,UnpackedRecord*,int*); +SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(VdbeCursor*,const UnpackedRecord*,int*); SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor *, i64 *); SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*); SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*); @@ -13995,16 +14099,16 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,int,Mem*); SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p); +#define VdbeMemDynamic(X) \ + (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0) #define VdbeMemRelease(X) \ - if((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame)) \ - sqlite3VdbeMemReleaseExternal(X); + if( VdbeMemDynamic(X) ) sqlite3VdbeMemReleaseExternal(X); SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); SQLITE_PRIVATE const char *sqlite3OpcodeName(int); SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*); SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *); -SQLITE_PRIVATE void sqlite3VdbeMemStoreType(Mem *pMem); SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p); SQLITE_PRIVATE int sqlite3VdbeSorterInit(sqlite3 *, VdbeCursor *); @@ -14025,6 +14129,7 @@ SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); #ifdef SQLITE_DEBUG SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*,Mem*); +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem*); #endif #ifndef SQLITE_OMIT_FOREIGN_KEY @@ -17773,6 +17878,12 @@ static void *memsys5MallocUnsafe(int nByte){ if( mem5.maxCountflags &= ~(MEM_Static|MEM_Dyn|MEM_Ephem); pMem->enc = desiredEnc; - pMem->flags |= (MEM_Term|MEM_Dyn); + pMem->flags |= (MEM_Term); pMem->z = (char*)zOut; pMem->zMalloc = pMem->z; @@ -21523,7 +21641,6 @@ SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *db, const void *z, int nByte, u8 e } assert( (m.flags & MEM_Term)!=0 || db->mallocFailed ); assert( (m.flags & MEM_Str)!=0 || db->mallocFailed ); - assert( (m.flags & MEM_Dyn)!=0 || db->mallocFailed ); assert( m.z || db->mallocFailed ); return m.z; } @@ -22733,13 +22850,12 @@ SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){ testcase( iA>0 && LARGEST_INT64 - iA == iB ); testcase( iA>0 && LARGEST_INT64 - iA == iB - 1 ); if( iA>0 && LARGEST_INT64 - iA < iB ) return 1; - *pA += iB; }else{ testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 1 ); testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 2 ); if( iA<0 && -(iA + LARGEST_INT64) > iB + 1 ) return 1; - *pA += iB; } + *pA += iB; return 0; } SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){ @@ -22763,9 +22879,18 @@ SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ iA0 = iA % TWOPOWER32; iB1 = iB/TWOPOWER32; iB0 = iB % TWOPOWER32; - if( iA1*iB1 != 0 ) return 1; - assert( iA1*iB0==0 || iA0*iB1==0 ); - r = iA1*iB0 + iA0*iB1; + if( iA1==0 ){ + if( iB1==0 ){ + *pA *= iB; + return 0; + } + r = iA0*iB1; + }else if( iB1==0 ){ + r = iA1*iB0; + }else{ + /* If both iA1 and iB1 are non-zero, overflow will result */ + return 1; + } testcase( r==(-TWOPOWER31)-1 ); testcase( r==(-TWOPOWER31) ); testcase( r==TWOPOWER31 ); @@ -23211,62 +23336,62 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 17 */ "Gosub" OpHelp(""), /* 18 */ "Return" OpHelp(""), /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), - /* 20 */ "Yield" OpHelp(""), - /* 21 */ "HaltIfNull" OpHelp("if r[P3] null then halt"), - /* 22 */ "Halt" OpHelp(""), - /* 23 */ "Integer" OpHelp("r[P2]=P1"), - /* 24 */ "Int64" OpHelp("r[P2]=P4"), - /* 25 */ "String" OpHelp("r[P2]='P4' (len=P1)"), - /* 26 */ "Null" OpHelp("r[P2..P3]=NULL"), - /* 27 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 28 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), - /* 29 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), - /* 30 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 31 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 32 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 33 */ "CollSeq" OpHelp(""), - /* 34 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), - /* 35 */ "MustBeInt" OpHelp(""), - /* 36 */ "RealAffinity" OpHelp(""), - /* 37 */ "Permutation" OpHelp(""), - /* 38 */ "Compare" OpHelp(""), - /* 39 */ "Jump" OpHelp(""), - /* 40 */ "Once" OpHelp(""), - /* 41 */ "If" OpHelp(""), - /* 42 */ "IfNot" OpHelp(""), - /* 43 */ "Column" OpHelp("r[P3]=PX"), - /* 44 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 45 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 46 */ "Count" OpHelp("r[P2]=count()"), - /* 47 */ "ReadCookie" OpHelp(""), - /* 48 */ "SetCookie" OpHelp(""), - /* 49 */ "VerifyCookie" OpHelp(""), - /* 50 */ "OpenRead" OpHelp("root=P2 iDb=P3"), - /* 51 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), - /* 52 */ "OpenAutoindex" OpHelp("nColumn=P2"), - /* 53 */ "OpenEphemeral" OpHelp("nColumn=P2"), - /* 54 */ "SorterOpen" OpHelp(""), - /* 55 */ "OpenPseudo" OpHelp("content in r[P2@P3]"), - /* 56 */ "Close" OpHelp(""), - /* 57 */ "SeekLt" OpHelp("key=r[P3@P4]"), - /* 58 */ "SeekLe" OpHelp("key=r[P3@P4]"), - /* 59 */ "SeekGe" OpHelp("key=r[P3@P4]"), - /* 60 */ "SeekGt" OpHelp("key=r[P3@P4]"), - /* 61 */ "Seek" OpHelp("intkey=r[P2]"), - /* 62 */ "NoConflict" OpHelp("key=r[P3@P4]"), - /* 63 */ "NotFound" OpHelp("key=r[P3@P4]"), - /* 64 */ "Found" OpHelp("key=r[P3@P4]"), - /* 65 */ "NotExists" OpHelp("intkey=r[P3]"), - /* 66 */ "Sequence" OpHelp("r[P2]=rowid"), - /* 67 */ "NewRowid" OpHelp("r[P2]=rowid"), - /* 68 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), - /* 69 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), - /* 70 */ "Delete" OpHelp(""), + /* 20 */ "InitCoroutine" OpHelp(""), + /* 21 */ "EndCoroutine" OpHelp(""), + /* 22 */ "Yield" OpHelp(""), + /* 23 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 24 */ "Halt" OpHelp(""), + /* 25 */ "Integer" OpHelp("r[P2]=P1"), + /* 26 */ "Int64" OpHelp("r[P2]=P4"), + /* 27 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 28 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 29 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 30 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 31 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 32 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 33 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 34 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 35 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 36 */ "CollSeq" OpHelp(""), + /* 37 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 38 */ "MustBeInt" OpHelp(""), + /* 39 */ "RealAffinity" OpHelp(""), + /* 40 */ "Permutation" OpHelp(""), + /* 41 */ "Compare" OpHelp(""), + /* 42 */ "Jump" OpHelp(""), + /* 43 */ "Once" OpHelp(""), + /* 44 */ "If" OpHelp(""), + /* 45 */ "IfNot" OpHelp(""), + /* 46 */ "Column" OpHelp("r[P3]=PX"), + /* 47 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 48 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 49 */ "Count" OpHelp("r[P2]=count()"), + /* 50 */ "ReadCookie" OpHelp(""), + /* 51 */ "SetCookie" OpHelp(""), + /* 52 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 53 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 54 */ "OpenAutoindex" OpHelp("nColumn=P2"), + /* 55 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 56 */ "SorterOpen" OpHelp(""), + /* 57 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), + /* 58 */ "Close" OpHelp(""), + /* 59 */ "SeekLT" OpHelp(""), + /* 60 */ "SeekLE" OpHelp(""), + /* 61 */ "SeekGE" OpHelp(""), + /* 62 */ "SeekGT" OpHelp(""), + /* 63 */ "Seek" OpHelp("intkey=r[P2]"), + /* 64 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 65 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 66 */ "Found" OpHelp("key=r[P3@P4]"), + /* 67 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 68 */ "Sequence" OpHelp("r[P2]=rowid"), + /* 69 */ "NewRowid" OpHelp("r[P2]=rowid"), + /* 70 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), /* 71 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), /* 72 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), - /* 73 */ "ResetCount" OpHelp(""), - /* 74 */ "SorterCompare" OpHelp("if key(P1)!=rtrim(r[P3],P4) goto P2"), - /* 75 */ "SorterData" OpHelp("r[P2]=data"), + /* 73 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), + /* 74 */ "Delete" OpHelp(""), + /* 75 */ "ResetCount" OpHelp(""), /* 76 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), /* 77 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), /* 78 */ "Ne" OpHelp("if r[P1]!=r[P3] goto P2"), @@ -23275,7 +23400,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 81 */ "Le" OpHelp("if r[P1]<=r[P3] goto P2"), /* 82 */ "Lt" OpHelp("if r[P1]=r[P3] goto P2"), - /* 84 */ "RowKey" OpHelp("r[P2]=key"), + /* 84 */ "SorterCompare" OpHelp("if key(P1)!=rtrim(r[P3],P4) goto P2"), /* 85 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), /* 86 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), /* 87 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<0 goto P2"), - /* 129 */ "IfNeg" OpHelp("if r[P1]<0 goto P2"), - /* 130 */ "IfZero" OpHelp("r[P1]+=P3, if r[P1]==0 goto P2"), - /* 131 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 132 */ "IncrVacuum" OpHelp(""), + /* 98 */ "RowKey" OpHelp("r[P2]=key"), + /* 99 */ "RowData" OpHelp("r[P2]=data"), + /* 100 */ "Rowid" OpHelp("r[P2]=rowid"), + /* 101 */ "NullRow" OpHelp(""), + /* 102 */ "Last" OpHelp(""), + /* 103 */ "SorterSort" OpHelp(""), + /* 104 */ "Sort" OpHelp(""), + /* 105 */ "Rewind" OpHelp(""), + /* 106 */ "SorterInsert" OpHelp(""), + /* 107 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 108 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 109 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 110 */ "IdxLE" OpHelp("key=r[P3@P4]"), + /* 111 */ "IdxGT" OpHelp("key=r[P3@P4]"), + /* 112 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 113 */ "IdxGE" OpHelp("key=r[P3@P4]"), + /* 114 */ "Destroy" OpHelp(""), + /* 115 */ "Clear" OpHelp(""), + /* 116 */ "CreateIndex" OpHelp("r[P2]=root iDb=P1"), + /* 117 */ "CreateTable" OpHelp("r[P2]=root iDb=P1"), + /* 118 */ "ParseSchema" OpHelp(""), + /* 119 */ "LoadAnalysis" OpHelp(""), + /* 120 */ "DropTable" OpHelp(""), + /* 121 */ "DropIndex" OpHelp(""), + /* 122 */ "DropTrigger" OpHelp(""), + /* 123 */ "IntegrityCk" OpHelp(""), + /* 124 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 125 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), + /* 126 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 127 */ "Program" OpHelp(""), + /* 128 */ "Param" OpHelp(""), + /* 129 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 130 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), + /* 131 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 132 */ "IfPos" OpHelp("if r[P1]>0 goto P2"), /* 133 */ "Real" OpHelp("r[P2]=P4"), - /* 134 */ "Expire" OpHelp(""), - /* 135 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 136 */ "VBegin" OpHelp(""), - /* 137 */ "VCreate" OpHelp(""), - /* 138 */ "VDestroy" OpHelp(""), - /* 139 */ "VOpen" OpHelp(""), - /* 140 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 141 */ "VNext" OpHelp(""), - /* 142 */ "VRename" OpHelp(""), + /* 134 */ "IfNeg" OpHelp("if r[P1]<0 goto P2"), + /* 135 */ "IfZero" OpHelp("r[P1]+=P3, if r[P1]==0 goto P2"), + /* 136 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 137 */ "IncrVacuum" OpHelp(""), + /* 138 */ "Expire" OpHelp(""), + /* 139 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 140 */ "VBegin" OpHelp(""), + /* 141 */ "VCreate" OpHelp(""), + /* 142 */ "VDestroy" OpHelp(""), /* 143 */ "ToText" OpHelp(""), /* 144 */ "ToBlob" OpHelp(""), /* 145 */ "ToNumeric" OpHelp(""), /* 146 */ "ToInt" OpHelp(""), /* 147 */ "ToReal" OpHelp(""), - /* 148 */ "Pagecount" OpHelp(""), - /* 149 */ "MaxPgcnt" OpHelp(""), - /* 150 */ "Trace" OpHelp(""), - /* 151 */ "Noop" OpHelp(""), - /* 152 */ "Explain" OpHelp(""), + /* 148 */ "VOpen" OpHelp(""), + /* 149 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 150 */ "VNext" OpHelp(""), + /* 151 */ "VRename" OpHelp(""), + /* 152 */ "Pagecount" OpHelp(""), + /* 153 */ "MaxPgcnt" OpHelp(""), + /* 154 */ "Init" OpHelp("Start at P2"), + /* 155 */ "Noop" OpHelp(""), + /* 156 */ "Explain" OpHelp(""), }; return azName[i]; } @@ -23435,32 +23564,6 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ # endif #endif -/* -** These #defines should enable >2GB file support on Posix if the -** underlying operating system supports it. If the OS lacks -** large file support, these should be no-ops. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: RedHat 7.2) but you want your code to work -** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in RedHat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -** -** The previous paragraph was written in 2005. (This paragraph is written -** on 2008-11-28.) These days, all Linux kernels support large files, so -** you should probably leave LFS enabled. But some embedded platforms might -** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - /* ** standard include files. */ @@ -34449,7 +34552,7 @@ static int winDeviceCharacteristics(sqlite3_file *id){ ** During sqlite3_os_init() we do a GetSystemInfo() ** to get the granularity size. */ -SYSTEM_INFO winSysInfo; +static SYSTEM_INFO winSysInfo; #ifndef SQLITE_OMIT_WAL @@ -36383,15 +36486,29 @@ static int winFullPathname( ** Interfaces for opening a shared library, finding entry points ** within the shared library, and closing the shared library. */ -/* -** Interfaces for opening a shared library, finding entry points -** within the shared library, and closing the shared library. -*/ static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ HANDLE h; +#if defined(__CYGWIN__) + int nFull = pVfs->mxPathname+1; + char *zFull = sqlite3MallocZero( nFull ); + void *zConverted = 0; + if( zFull==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + if( winFullPathname(pVfs, zFilename, nFull, zFull)!=SQLITE_OK ){ + sqlite3_free(zFull); + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + zConverted = winConvertFromUtf8Filename(zFull); + sqlite3_free(zFull); +#else void *zConverted = winConvertFromUtf8Filename(zFilename); UNUSED_PARAMETER(pVfs); +#endif if( zConverted==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); return 0; } if( osIsNT() ){ @@ -36406,6 +36523,7 @@ static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ h = osLoadLibraryA((char*)zConverted); } #endif + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)h)); sqlite3_free(zConverted); return (void*)h; } @@ -36414,12 +36532,17 @@ static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ winGetLastErrorMsg(osGetLastError(), nBuf, zBufOut); } static void (*winDlSym(sqlite3_vfs *pVfs,void *pH,const char *zSym))(void){ + FARPROC proc; UNUSED_PARAMETER(pVfs); - return (void(*)(void))osGetProcAddressA((HANDLE)pH, zSym); + proc = osGetProcAddressA((HANDLE)pH, zSym); + OSTRACE(("DLSYM handle=%p, symbol=%s, address=%p\n", + (void*)pH, zSym, (void*)proc)); + return (void(*)(void))proc; } static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ UNUSED_PARAMETER(pVfs); osFreeLibrary((HANDLE)pHandle); + OSTRACE(("DLCLOSE handle=%p\n", (void*)pHandle)); } #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ #define winDlOpen 0 @@ -37115,7 +37238,8 @@ struct PCache { int szCache; /* Configured cache size */ int szPage; /* Size of every page in this cache */ int szExtra; /* Size of extra space for each page */ - int bPurgeable; /* True if pages are on backing store */ + u8 bPurgeable; /* True if pages are on backing store */ + u8 eCreate; /* eCreate value for for xFetch() */ int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */ void *pStress; /* Argument to xStress */ sqlite3_pcache *pCache; /* Pluggable cache module */ @@ -37182,6 +37306,10 @@ static void pcacheRemoveFromDirtyList(PgHdr *pPage){ }else{ assert( pPage==p->pDirty ); p->pDirty = pPage->pDirtyNext; + if( p->pDirty==0 && p->bPurgeable ){ + assert( p->eCreate==1 ); + p->eCreate = 2; + } } pPage->pDirtyNext = 0; pPage->pDirtyPrev = 0; @@ -37202,6 +37330,9 @@ static void pcacheAddToDirtyList(PgHdr *pPage){ if( pPage->pDirtyNext ){ assert( pPage->pDirtyNext->pDirtyPrev==0 ); pPage->pDirtyNext->pDirtyPrev = pPage; + }else if( p->bPurgeable ){ + assert( p->eCreate==2 ); + p->eCreate = 1; } p->pDirty = pPage; if( !p->pDirtyTail ){ @@ -37271,6 +37402,7 @@ SQLITE_PRIVATE void sqlite3PcacheOpen( p->szPage = szPage; p->szExtra = szExtra; p->bPurgeable = bPurgeable; + p->eCreate = 2; p->xStress = xStress; p->pStress = pStress; p->szCache = 100; @@ -37310,7 +37442,7 @@ SQLITE_PRIVATE int sqlite3PcacheFetch( int createFlag, /* If true, create page if it does not exist already */ PgHdr **ppPage /* Write the page here */ ){ - sqlite3_pcache_page *pPage = 0; + sqlite3_pcache_page *pPage; PgHdr *pPgHdr = 0; int eCreate; @@ -37321,8 +37453,12 @@ SQLITE_PRIVATE int sqlite3PcacheFetch( /* If the pluggable cache (sqlite3_pcache*) has not been allocated, ** allocate it now. */ - if( !pCache->pCache && createFlag ){ + if( !pCache->pCache ){ sqlite3_pcache *p; + if( !createFlag ){ + *ppPage = 0; + return SQLITE_OK; + } p = sqlite3GlobalConfig.pcache2.xCreate( pCache->szPage, pCache->szExtra + sizeof(PgHdr), pCache->bPurgeable ); @@ -37333,11 +37469,16 @@ SQLITE_PRIVATE int sqlite3PcacheFetch( pCache->pCache = p; } - eCreate = createFlag * (1 + (!pCache->bPurgeable || !pCache->pDirty)); - if( pCache->pCache ){ - pPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); - } - + /* eCreate defines what to do if the page does not exist. + ** 0 Do not allocate a new page. (createFlag==0) + ** 1 Allocate a new page if doing so is inexpensive. + ** (createFlag==1 AND bPurgeable AND pDirty) + ** 2 Allocate a new page even it doing so is difficult. + ** (createFlag==1 AND !(bPurgeable AND pDirty) + */ + eCreate = createFlag==0 ? 0 : pCache->eCreate; + assert( (createFlag*(1+(!pCache->bPurgeable||!pCache->pDirty)))==eCreate ); + pPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); if( !pPage && eCreate==1 ){ PgHdr *pPg; @@ -44285,15 +44426,17 @@ static int hasHotJournal(Pager *pPager, int *pExists){ if( rc==SQLITE_OK && !locked ){ Pgno nPage; /* Number of pages in database file */ - /* Check the size of the database file. If it consists of 0 pages, - ** then delete the journal file. See the header comment above for - ** the reasoning here. Delete the obsolete journal file under - ** a RESERVED lock to avoid race conditions and to avoid violating - ** [H33020]. - */ rc = pagerPagecount(pPager, &nPage); if( rc==SQLITE_OK ){ - if( nPage==0 ){ + /* If the database is zero pages in size, that means that either (1) the + ** journal is a remnant from a prior database with the same name where + ** the database file but not the journal was deleted, or (2) the initial + ** transaction that populates a new database is being rolled back. + ** In either case, the journal file can be deleted. However, take care + ** not to delete the journal file if it is already open due to + ** journal_mode=PERSIST. + */ + if( nPage==0 && !jrnlOpen ){ sqlite3BeginBenignMalloc(); if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ sqlite3OsDelete(pVfs, pPager->zJournal, 0); @@ -47925,7 +48068,7 @@ SQLITE_PRIVATE int sqlite3WalOpen( sqlite3OsClose(pRet->pWalFd); sqlite3_free(pRet); }else{ - int iDC = sqlite3OsDeviceCharacteristics(pRet->pWalFd); + int iDC = sqlite3OsDeviceCharacteristics(pDbFd); if( iDC & SQLITE_IOCAP_SEQUENTIAL ){ pRet->syncHeader = 0; } if( iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE ){ pRet->padToSectorBoundary = 0; @@ -49296,7 +49439,7 @@ static int walWriteToLog( iAmt -= iFirstAmt; pContent = (void*)(iFirstAmt + (char*)pContent); assert( p->syncFlags & (SQLITE_SYNC_NORMAL|SQLITE_SYNC_FULL) ); - rc = sqlite3OsSync(p->pFd, p->syncFlags); + rc = sqlite3OsSync(p->pFd, p->syncFlags & SQLITE_SYNC_MASK); if( iAmt==0 || rc ) return rc; } rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset); @@ -50234,7 +50377,6 @@ struct BtCursor { Pgno *aOverflow; /* Cache of overflow page locations */ #endif Pgno pgnoRoot; /* The root page of this tree */ - sqlite3_int64 cachedRowid; /* Next rowid cache. 0 means not valid */ CellInfo info; /* A parse of the cell we are pointing at */ i64 nKey; /* Size of pKey, or last integer key */ void *pKey; /* Saved key that was cursor's last known position */ @@ -52218,13 +52360,12 @@ static void zeroPage(MemPage *pPage, int flags){ memset(&data[hdr], 0, pBt->usableSize - hdr); } data[hdr] = (char)flags; - first = hdr + 8 + 4*((flags&PTF_LEAF)==0 ?1:0); + first = hdr + ((flags&PTF_LEAF)==0 ? 12 : 8); memset(&data[hdr+1], 0, 4); data[hdr+7] = 0; put2byte(&data[hdr+5], pBt->usableSize); pPage->nFree = (u16)(pBt->usableSize - first); decodeFlags(pPage, flags); - pPage->hdrOffset = hdr; pPage->cellOffset = first; pPage->aDataEnd = &data[pBt->usableSize]; pPage->aCellIdx = &data[first]; @@ -54308,7 +54449,6 @@ static int btreeCursor( } pBt->pCursor = pCur; pCur->eState = CURSOR_INVALID; - pCur->cachedRowid = 0; return SQLITE_OK; } SQLITE_PRIVATE int sqlite3BtreeCursor( @@ -54349,36 +54489,6 @@ SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){ memset(p, 0, offsetof(BtCursor, iPage)); } -/* -** Set the cached rowid value of every cursor in the same database file -** as pCur and having the same root page number as pCur. The value is -** set to iRowid. -** -** Only positive rowid values are considered valid for this cache. -** The cache is initialized to zero, indicating an invalid cache. -** A btree will work fine with zero or negative rowids. We just cannot -** cache zero or negative rowids, which means tables that use zero or -** negative rowids might run a little slower. But in practice, zero -** or negative rowids are very uncommon so this should not be a problem. -*/ -SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor *pCur, sqlite3_int64 iRowid){ - BtCursor *p; - for(p=pCur->pBt->pCursor; p; p=p->pNext){ - if( p->pgnoRoot==pCur->pgnoRoot ) p->cachedRowid = iRowid; - } - assert( pCur->cachedRowid==iRowid ); -} - -/* -** Return the cached rowid for the given cursor. A negative or zero -** return value indicates that the rowid cache is invalid and should be -** ignored. If the rowid cache has never before been set, then a -** zero is returned. -*/ -SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor *pCur){ - return pCur->cachedRowid; -} - /* ** Close a cursor. The read lock on the database file is released ** when the last cursor is closed. @@ -55255,6 +55365,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( int *pRes /* Write search results here */ ){ int rc; + RecordCompare xRecordCompare; assert( cursorHoldsMutex(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); @@ -55276,6 +55387,16 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( } } + if( pIdxKey ){ + xRecordCompare = sqlite3VdbeFindCompare(pIdxKey); + assert( pIdxKey->default_rc==1 + || pIdxKey->default_rc==0 + || pIdxKey->default_rc==-1 + ); + }else{ + xRecordCompare = 0; /* All keys are integers */ + } + rc = moveToRoot(pCur); if( rc ){ return rc; @@ -55308,7 +55429,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( assert( biasRight==0 || biasRight==1 ); idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ pCur->aiIdx[pCur->iPage] = (u16)idx; - if( pPage->intKey ){ + if( xRecordCompare==0 ){ for(;;){ i64 nCellKey; pCell = findCell(pPage, idx) + pPage->childPtrSize; @@ -55360,14 +55481,14 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( ** single byte varint and the record fits entirely on the main ** b-tree page. */ testcase( pCell+nCell+1==pPage->aDataEnd ); - c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey, 0); }else if( !(pCell[1] & 0x80) && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal ){ /* The record-size field is a 2 byte varint and the record ** fits entirely on the main b-tree page. */ testcase( pCell+nCell+2==pPage->aDataEnd ); - c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey, 0); }else{ /* The record flows over onto one or more overflow pages. In ** this case the whole cell needs to be parsed, a buffer allocated @@ -55388,7 +55509,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( sqlite3_free(pCellKey); goto moveto_finish; } - c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); + c = xRecordCompare(nCell, pCellKey, pIdxKey, 0); sqlite3_free(pCellKey); } if( c<0 ){ @@ -55453,6 +55574,15 @@ SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ ** successful then set *pRes=0. If the cursor ** was already pointing to the last entry in the database before ** this routine was called, then set *pRes=1. +** +** The calling function will set *pRes to 0 or 1. The initial *pRes value +** will be 1 if the cursor being stepped corresponds to an SQL index and +** if this routine could have been skipped if that SQL index had been +** a unique index. Otherwise the caller will have set *pRes to zero. +** Zero is the common case. The btree implementation is free to use the +** initial *pRes value as a hint to improve performance, but the current +** SQLite btree implementation does not. (Note that the comdb2 btree +** implementation does use this hint, however.) */ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ int rc; @@ -55461,6 +55591,7 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ assert( cursorHoldsMutex(pCur) ); assert( pRes!=0 ); + assert( *pRes==0 || *pRes==1 ); assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); if( pCur->eState!=CURSOR_VALID ){ rc = restoreCursorPosition(pCur); @@ -55539,6 +55670,15 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ ** successful then set *pRes=0. If the cursor ** was already pointing to the first entry in the database before ** this routine was called, then set *pRes=1. +** +** The calling function will set *pRes to 0 or 1. The initial *pRes value +** will be 1 if the cursor being stepped corresponds to an SQL index and +** if this routine could have been skipped if that SQL index had been +** a unique index. Otherwise the caller will have set *pRes to zero. +** Zero is the common case. The btree implementation is free to use the +** initial *pRes value as a hint to improve performance, but the current +** SQLite btree implementation does not. (Note that the comdb2 btree +** implementation does use this hint, however.) */ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ int rc; @@ -55546,6 +55686,7 @@ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ assert( cursorHoldsMutex(pCur) ); assert( pRes!=0 ); + assert( *pRes==0 || *pRes==1 ); assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->atLast = 0; if( pCur->eState!=CURSOR_VALID ){ @@ -57642,11 +57783,17 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); if( rc ) return rc; - /* If this is an insert into a table b-tree, invalidate any incrblob - ** cursors open on the row being replaced (assuming this is a replace - ** operation - if it is not, the following is a no-op). */ if( pCur->pKeyInfo==0 ){ + /* If this is an insert into a table b-tree, invalidate any incrblob + ** cursors open on the row being replaced */ invalidateIncrblobCursors(p, nKey, 0); + + /* If the cursor is currently on the last row and we are appending a + ** new row onto the end, set the "loc" to avoid an unnecessary btreeMoveto() + ** call */ + if( pCur->validNKey && nKey>0 && pCur->info.nKey==nKey-1 ){ + loc = -1; + } } if( !loc ){ @@ -57716,8 +57863,8 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** row without seeking the cursor. This can be a big performance boost. */ pCur->info.nSize = 0; - pCur->validNKey = 0; if( rc==SQLITE_OK && pPage->nOverflow ){ + pCur->validNKey = 0; rc = balance(pCur); /* Must make sure nOverflow is reset to zero even if the balance() @@ -57772,7 +57919,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){ ** sub-tree headed by the child page of the cell being deleted. This makes ** balancing the tree following the delete operation easier. */ if( !pPage->leaf ){ - int notUsed; + int notUsed = 0; rc = sqlite3BtreePrevious(pCur, ¬Used); if( rc ) return rc; } @@ -59926,6 +60073,42 @@ copy_finished: ** name sqlite_value */ +#ifdef SQLITE_DEBUG +/* +** Check invariants on a Mem object. +** +** This routine is intended for use inside of assert() statements, like +** this: assert( sqlite3VdbeCheckMemInvariants(pMem) ); +*/ +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ + /* The MEM_Dyn bit is set if and only if Mem.xDel is a non-NULL destructor + ** function for Mem.z + */ + assert( (p->flags & MEM_Dyn)==0 || p->xDel!=0 ); + assert( (p->flags & MEM_Dyn)!=0 || p->xDel==0 ); + + /* If p holds a string or blob, the Mem.z must point to exactly + ** one of the following: + ** + ** (1) Memory in Mem.zMalloc and managed by the Mem object + ** (2) Memory to be freed using Mem.xDel + ** (3) An ephermal string or blob + ** (4) A static string or blob + */ + if( (p->flags & (MEM_Str|MEM_Blob)) && p->z!=0 ){ + assert( + ((p->z==p->zMalloc)? 1 : 0) + + ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + + ((p->flags&MEM_Static)!=0 ? 1 : 0) == 1 + ); + } + + return 1; +} +#endif + + /* ** If pMem is an object with a valid string representation, this routine ** ensures the internal encoding for the string representation is @@ -59975,12 +60158,7 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ ** in pMem->z is discarded. */ SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ - assert( 1 >= - ((pMem->zMalloc && pMem->zMalloc==pMem->z) ? 1 : 0) + - (((pMem->flags&MEM_Dyn)&&pMem->xDel) ? 1 : 0) + - ((pMem->flags&MEM_Ephem) ? 1 : 0) + - ((pMem->flags&MEM_Static) ? 1 : 0) - ); + assert( sqlite3VdbeCheckMemInvariants(pMem) ); assert( (pMem->flags&MEM_RowSet)==0 ); /* If the bPreserve flag is set to true, then the memory cell must already @@ -59998,7 +60176,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); } if( pMem->zMalloc==0 ){ - sqlite3VdbeMemRelease(pMem); + VdbeMemRelease(pMem); + pMem->z = 0; pMem->flags = MEM_Null; return SQLITE_NOMEM; } @@ -60007,13 +60186,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ if( pMem->z && bPreserve && pMem->z!=pMem->zMalloc ){ memcpy(pMem->zMalloc, pMem->z, pMem->n); } - if( (pMem->flags&MEM_Dyn)!=0 && pMem->xDel ){ - assert( pMem->xDel!=SQLITE_DYNAMIC ); + if( (pMem->flags&MEM_Dyn)!=0 ){ + assert( pMem->xDel!=0 && pMem->xDel!=SQLITE_DYNAMIC ); pMem->xDel((void *)(pMem->z)); } pMem->z = pMem->zMalloc; - pMem->flags &= ~(MEM_Ephem|MEM_Static); + pMem->flags &= ~(MEM_Dyn|MEM_Ephem|MEM_Static); pMem->xDel = 0; return SQLITE_OK; } @@ -60182,9 +60361,9 @@ SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p){ sqlite3VdbeMemFinalize(p, p->u.pDef); assert( (p->flags & MEM_Agg)==0 ); sqlite3VdbeMemRelease(p); - }else if( p->flags&MEM_Dyn && p->xDel ){ + }else if( p->flags&MEM_Dyn ){ assert( (p->flags&MEM_RowSet)==0 ); - assert( p->xDel!=SQLITE_DYNAMIC ); + assert( p->xDel!=SQLITE_DYNAMIC && p->xDel!=0 ); p->xDel((void *)p->z); p->xDel = 0; }else if( p->flags&MEM_RowSet ){ @@ -60197,9 +60376,10 @@ SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p){ /* ** Release any memory held by the Mem. This may leave the Mem in an ** inconsistent state, for example with (Mem.z==0) and -** (Mem.type==SQLITE_TEXT). +** (Mem.flags==MEM_Str). */ SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ + assert( sqlite3VdbeCheckMemInvariants(p) ); VdbeMemRelease(p); if( p->zMalloc ){ sqlite3DbFree(p->db, p->zMalloc); @@ -60388,7 +60568,6 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){ sqlite3RowSetClear(pMem->u.pRowSet); } MemSetTypeFlag(pMem, MEM_Null); - pMem->type = SQLITE_NULL; } SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ sqlite3VdbeMemSetNull((Mem*)p); @@ -60401,7 +60580,6 @@ SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){ sqlite3VdbeMemRelease(pMem); pMem->flags = MEM_Blob|MEM_Zero; - pMem->type = SQLITE_BLOB; pMem->n = 0; if( n<0 ) n = 0; pMem->u.nZero = n; @@ -60424,7 +60602,6 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){ sqlite3VdbeMemRelease(pMem); pMem->u.i = val; pMem->flags = MEM_Int; - pMem->type = SQLITE_INTEGER; } #ifndef SQLITE_OMIT_FLOATING_POINT @@ -60439,7 +60616,6 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){ sqlite3VdbeMemRelease(pMem); pMem->r = val; pMem->flags = MEM_Real; - pMem->type = SQLITE_FLOAT; } } #endif @@ -60495,7 +60671,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ Mem *pX; for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ - pX->flags |= MEM_Invalid; + pX->flags |= MEM_Undefined; pX->pScopyFrom = 0; } } @@ -60537,6 +60713,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ VdbeMemRelease(pTo); memcpy(pTo, pFrom, MEMCELLSIZE); pTo->flags &= ~MEM_Dyn; + pTo->xDel = 0; if( pTo->flags&(MEM_Str|MEM_Blob) ){ if( 0==(pFrom->flags&MEM_Static) ){ @@ -60647,7 +60824,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( pMem->n = nByte; pMem->flags = flags; pMem->enc = (enc==0 ? SQLITE_UTF8 : enc); - pMem->type = (enc==0 ? SQLITE_BLOB : SQLITE_TEXT); #ifndef SQLITE_OMIT_UTF16 if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ @@ -60662,119 +60838,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( return SQLITE_OK; } -/* -** Compare the values contained by the two memory cells, returning -** negative, zero or positive if pMem1 is less than, equal to, or greater -** than pMem2. Sorting order is NULL's first, followed by numbers (integers -** and reals) sorted numerically, followed by text ordered by the collating -** sequence pColl and finally blob's ordered by memcmp(). -** -** Two NULL values are considered equal by this function. -*/ -SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){ - int rc; - int f1, f2; - int combined_flags; - - f1 = pMem1->flags; - f2 = pMem2->flags; - combined_flags = f1|f2; - assert( (combined_flags & MEM_RowSet)==0 ); - - /* If one value is NULL, it is less than the other. If both values - ** are NULL, return 0. - */ - if( combined_flags&MEM_Null ){ - return (f2&MEM_Null) - (f1&MEM_Null); - } - - /* If one value is a number and the other is not, the number is less. - ** If both are numbers, compare as reals if one is a real, or as integers - ** if both values are integers. - */ - if( combined_flags&(MEM_Int|MEM_Real) ){ - double r1, r2; - if( (f1 & f2 & MEM_Int)!=0 ){ - if( pMem1->u.i < pMem2->u.i ) return -1; - if( pMem1->u.i > pMem2->u.i ) return 1; - return 0; - } - if( (f1&MEM_Real)!=0 ){ - r1 = pMem1->r; - }else if( (f1&MEM_Int)!=0 ){ - r1 = (double)pMem1->u.i; - }else{ - return 1; - } - if( (f2&MEM_Real)!=0 ){ - r2 = pMem2->r; - }else if( (f2&MEM_Int)!=0 ){ - r2 = (double)pMem2->u.i; - }else{ - return -1; - } - if( r1r2 ) return 1; - return 0; - } - - /* If one value is a string and the other is a blob, the string is less. - ** If both are strings, compare using the collating functions. - */ - if( combined_flags&MEM_Str ){ - if( (f1 & MEM_Str)==0 ){ - return 1; - } - if( (f2 & MEM_Str)==0 ){ - return -1; - } - - assert( pMem1->enc==pMem2->enc ); - assert( pMem1->enc==SQLITE_UTF8 || - pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); - - /* The collation sequence must be defined at this point, even if - ** the user deletes the collation sequence after the vdbe program is - ** compiled (this was not always the case). - */ - assert( !pColl || pColl->xCmp ); - - if( pColl ){ - if( pMem1->enc==pColl->enc ){ - /* The strings are already in the correct encoding. Call the - ** comparison function directly */ - return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z); - }else{ - const void *v1, *v2; - int n1, n2; - Mem c1; - Mem c2; - memset(&c1, 0, sizeof(c1)); - memset(&c2, 0, sizeof(c2)); - sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); - sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); - v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); - n1 = v1==0 ? 0 : c1.n; - v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); - n2 = v2==0 ? 0 : c2.n; - rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2); - sqlite3VdbeMemRelease(&c1); - sqlite3VdbeMemRelease(&c2); - return rc; - } - } - /* If a NULL pointer was passed as the collate function, fall through - ** to the blob case and use memcmp(). */ - } - - /* Both values must be blobs. Compare using memcmp(). */ - rc = memcmp(pMem1->z, pMem2->z, (pMem1->n>pMem2->n)?pMem2->n:pMem1->n); - if( rc==0 ){ - rc = pMem1->n - pMem2->n; - } - return rc; -} - /* ** Move data out of a btree key or data field and into a Mem structure. ** The data or key is taken from the entry that pCur is currently pointing @@ -60815,22 +60878,22 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( sqlite3VdbeMemRelease(pMem); pMem->z = &zData[offset]; pMem->flags = MEM_Blob|MEM_Ephem; + pMem->n = (int)amt; }else if( SQLITE_OK==(rc = sqlite3VdbeMemGrow(pMem, amt+2, 0)) ){ - pMem->flags = MEM_Blob|MEM_Dyn|MEM_Term; - pMem->enc = 0; - pMem->type = SQLITE_BLOB; if( key ){ rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); }else{ rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); } - pMem->z[amt] = 0; - pMem->z[amt+1] = 0; - if( rc!=SQLITE_OK ){ + if( rc==SQLITE_OK ){ + pMem->z[amt] = 0; + pMem->z[amt+1] = 0; + pMem->flags = MEM_Blob|MEM_Term; + pMem->n = (int)amt; + }else{ sqlite3VdbeMemRelease(pMem); } } - pMem->n = (int)amt; return rc; } @@ -60888,7 +60951,6 @@ SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){ Mem *p = sqlite3DbMallocZero(db, sizeof(*p)); if( p ){ p->flags = MEM_Null; - p->type = SQLITE_NULL; p->db = db; } return p; @@ -60934,11 +60996,9 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ if( pRec->pKeyInfo ){ assert( pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField==nCol ); assert( pRec->pKeyInfo->enc==ENC(db) ); - pRec->flags = UNPACKED_PREFIX_MATCH; pRec->aMem = (Mem *)((u8*)pRec + ROUND8(sizeof(UnpackedRecord))); for(i=0; iaMem[i].flags = MEM_Null; - pRec->aMem[i].type = SQLITE_NULL; pRec->aMem[i].db = db; } }else{ @@ -61011,7 +61071,6 @@ static int valueFromExpr( zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); if( zVal==0 ) goto no_mem; sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); - if( op==TK_FLOAT ) pVal->type = SQLITE_FLOAT; } if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){ sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); @@ -61029,9 +61088,9 @@ static int valueFromExpr( ){ sqlite3VdbeMemNumerify(pVal); if( pVal->u.i==SMALLEST_INT64 ){ - pVal->flags &= MEM_Int; + pVal->flags &= ~MEM_Int; pVal->flags |= MEM_Real; - pVal->r = (double)LARGEST_INT64; + pVal->r = (double)SMALLEST_INT64; }else{ pVal->u.i = -pVal->u.i; } @@ -61057,9 +61116,6 @@ static int valueFromExpr( } #endif - if( pVal ){ - sqlite3VdbeMemStoreType(pVal); - } *ppVal = pVal; return rc; @@ -61223,7 +61279,6 @@ SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( sqlite3ValueApplyAffinity(pVal, affinity, ENC(db)); } pVal->db = pParse->db; - sqlite3VdbeMemStoreType((Mem*)pVal); } } }else{ @@ -61468,6 +61523,9 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ #ifdef VDBE_PROFILE pOp->cycles = 0; pOp->cnt = 0; +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOp->iSrcLine = 0; #endif return i; } @@ -61830,7 +61888,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg) ** Add a whole list of operations to the operation stack. Return the ** address of the first operation added. */ -SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){ +SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp, int iLineno){ int addr; assert( p->magic==VDBE_MAGIC_INIT ); if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p) ){ @@ -61858,6 +61916,11 @@ SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp) #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS pOut->zComment = 0; #endif +#ifdef SQLITE_VDBE_COVERAGE + pOut->iSrcLine = iLineno+i; +#else + (void)iLineno; +#endif #ifdef SQLITE_DEBUG if( p->db->flags & SQLITE_VdbeAddopTrace ){ sqlite3VdbePrintOp(0, i+addr, &p->aOp[i+addr]); @@ -62146,6 +62209,15 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){ } #endif /* NDEBUG */ +#ifdef SQLITE_VDBE_COVERAGE +/* +** Set the value if the iSrcLine field for the previously coded instruction. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){ + sqlite3VdbeGetOp(v,-1)->iSrcLine = iLine; +} +#endif /* SQLITE_VDBE_COVERAGE */ + /* ** Return the opcode for a given address. If the address is -1, then ** return the most recently inserted opcode. @@ -62158,14 +62230,6 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){ ** this routine is a valid pointer. But because the dummy.opcode is 0, ** dummy will never be written to. This is verified by code inspection and ** by running with Valgrind. -** -** About the #ifdef SQLITE_OMIT_TRACE: Normally, this routine is never called -** unless p->nOp>0. This is because in the absense of SQLITE_OMIT_TRACE, -** an OP_Trace instruction is always inserted by sqlite3VdbeGet() as soon as -** a new VDBE is created. So we are free to set addr to p->nOp-1 without -** having to double-check to make sure that the result is non-negative. But -** if SQLITE_OMIT_TRACE is defined, the OP_Trace is omitted and we do need to -** check the value of p->nOp-1 before continuing. */ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ /* C89 specifies that the constant "dummy" will be initialized to all @@ -62173,9 +62237,6 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */ assert( p->magic==VDBE_MAGIC_INIT ); if( addr<0 ){ -#ifdef SQLITE_OMIT_TRACE - if( p->nOp==0 ) return (VdbeOp*)&dummy; -#endif addr = p->nOp - 1; } assert( (addr>=0 && addrnOp) || p->db->mallocFailed ); @@ -62480,7 +62541,7 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){ #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS displayComment(pOp, zP4, zCom, sizeof(zCom)); #else - zCom[0] = 0 + zCom[0] = 0; #endif /* NB: The sqlite3OpcodeName() function is implemented by code created ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the @@ -62509,6 +62570,7 @@ static void releaseMemArray(Mem *p, int N){ } for(pEnd=&p[N]; pflags & MEM_Agg ); + testcase( p->flags & MEM_Dyn ); + testcase( p->flags & MEM_Frame ); + testcase( p->flags & MEM_RowSet ); if( p->flags&(MEM_Agg|MEM_Dyn|MEM_Frame|MEM_RowSet) ){ sqlite3VdbeMemRelease(p); }else if( p->zMalloc ){ @@ -62529,7 +62595,7 @@ static void releaseMemArray(Mem *p, int N){ p->zMalloc = 0; } - p->flags = MEM_Invalid; + p->flags = MEM_Undefined; } db->mallocFailed = malloc_failed; } @@ -62651,7 +62717,6 @@ SQLITE_PRIVATE int sqlite3VdbeList( } if( p->explain==1 ){ pMem->flags = MEM_Int; - pMem->type = SQLITE_INTEGER; pMem->u.i = i; /* Program counter */ pMem++; @@ -62659,7 +62724,6 @@ SQLITE_PRIVATE int sqlite3VdbeList( pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ assert( pMem->z!=0 ); pMem->n = sqlite3Strlen30(pMem->z); - pMem->type = SQLITE_TEXT; pMem->enc = SQLITE_UTF8; pMem++; @@ -62685,24 +62749,21 @@ SQLITE_PRIVATE int sqlite3VdbeList( pMem->flags = MEM_Int; pMem->u.i = pOp->p1; /* P1 */ - pMem->type = SQLITE_INTEGER; pMem++; pMem->flags = MEM_Int; pMem->u.i = pOp->p2; /* P2 */ - pMem->type = SQLITE_INTEGER; pMem++; pMem->flags = MEM_Int; pMem->u.i = pOp->p3; /* P3 */ - pMem->type = SQLITE_INTEGER; pMem++; if( sqlite3VdbeMemGrow(pMem, 32, 0) ){ /* P4 */ assert( p->db->mallocFailed ); return SQLITE_ERROR; } - pMem->flags = MEM_Dyn|MEM_Str|MEM_Term; + pMem->flags = MEM_Str|MEM_Term; zP4 = displayP4(pOp, pMem->z, 32); if( zP4!=pMem->z ){ sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0); @@ -62711,7 +62772,6 @@ SQLITE_PRIVATE int sqlite3VdbeList( pMem->n = sqlite3Strlen30(pMem->z); pMem->enc = SQLITE_UTF8; } - pMem->type = SQLITE_TEXT; pMem++; if( p->explain==1 ){ @@ -62719,10 +62779,9 @@ SQLITE_PRIVATE int sqlite3VdbeList( assert( p->db->mallocFailed ); return SQLITE_ERROR; } - pMem->flags = MEM_Dyn|MEM_Str|MEM_Term; + pMem->flags = MEM_Str|MEM_Term; pMem->n = 2; sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */ - pMem->type = SQLITE_TEXT; pMem->enc = SQLITE_UTF8; pMem++; @@ -62731,13 +62790,11 @@ SQLITE_PRIVATE int sqlite3VdbeList( assert( p->db->mallocFailed ); return SQLITE_ERROR; } - pMem->flags = MEM_Dyn|MEM_Str|MEM_Term; + pMem->flags = MEM_Str|MEM_Term; pMem->n = displayComment(pOp, zP4, pMem->z, 500); - pMem->type = SQLITE_TEXT; pMem->enc = SQLITE_UTF8; #else pMem->flags = MEM_Null; /* Comment */ - pMem->type = SQLITE_NULL; #endif } @@ -62760,7 +62817,7 @@ SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){ z = p->zSql; }else if( p->nOp>=1 ){ const VdbeOp *pOp = &p->aOp[0]; - if( pOp->opcode==OP_Trace && pOp->p4.z!=0 ){ + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ z = pOp->p4.z; while( sqlite3Isspace(*z) ) z++; } @@ -62779,7 +62836,7 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ if( sqlite3IoTrace==0 ) return; if( nOp<1 ) return; pOp = &p->aOp[0]; - if( pOp->opcode==OP_Trace && pOp->p4.z!=0 ){ + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ int i, j; char z[1000]; sqlite3_snprintf(sizeof(z), z, "%s", pOp->p4.z); @@ -62997,7 +63054,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( p->aMem--; /* aMem[] goes from 1..nMem */ p->nMem = nMem; /* not from 0..nMem-1 */ for(n=1; n<=nMem; n++){ - p->aMem[n].flags = MEM_Invalid; + p->aMem[n].flags = MEM_Undefined; p->aMem[n].db = db; } } @@ -63109,7 +63166,7 @@ static void Cleanup(Vdbe *p){ int i; if( p->apCsr ) for(i=0; inCursor; i++) assert( p->apCsr[i]==0 ); if( p->aMem ){ - for(i=1; i<=p->nMem; i++) assert( p->aMem[i].flags==MEM_Invalid ); + for(i=1; i<=p->nMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); } #endif @@ -63858,12 +63915,24 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ fprintf(out, "%02x", p->aOp[i].opcode); } fprintf(out, "\n"); + if( p->zSql ){ + char c, pc = 0; + fprintf(out, "-- "); + for(i=0; (c = p->zSql[i])!=0; i++){ + if( pc=='\n' ) fprintf(out, "-- "); + putc(c, out); + pc = c; + } + if( pc!='\n' ) fprintf(out, "\n"); + } for(i=0; inOp; i++){ - fprintf(out, "%6d %10lld %8lld ", + char zHdr[100]; + sqlite3_snprintf(sizeof(zHdr), zHdr, "%6u %12llu %8llu ", p->aOp[i].cnt, p->aOp[i].cycles, p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0 ); + fprintf(out, "%s", zHdr); sqlite3VdbePrintOp(out, i, &p->aOp[i]); } fclose(out); @@ -64218,6 +64287,14 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ return 0; } +/* Input "x" is a sequence of unsigned characters that represent a +** big-endian integer. Return the equivalent native integer +*/ +#define ONE_BYTE_INT(x) ((i8)(x)[0]) +#define TWO_BYTE_INT(x) (256*(i8)((x)[0])|(x)[1]) +#define THREE_BYTE_INT(x) (65536*(i8)((x)[0])|((x)[1]<<8)|(x)[2]) +#define FOUR_BYTE_UINT(x) (((u32)(x)[0]<<24)|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) + /* ** Deserialize the data blob pointed to by buf as serial type serial_type ** and store the result in pMem. Return the number of bytes read. @@ -64229,7 +64306,6 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( ){ u64 x; u32 y; - int i; switch( serial_type ){ case 10: /* Reserved for future use */ case 11: /* Reserved for future use */ @@ -64238,34 +64314,34 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( break; } case 1: { /* 1-byte signed integer */ - pMem->u.i = (signed char)buf[0]; + pMem->u.i = ONE_BYTE_INT(buf); pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); return 1; } case 2: { /* 2-byte signed integer */ - i = 256*(signed char)buf[0] | buf[1]; - pMem->u.i = (i64)i; + pMem->u.i = TWO_BYTE_INT(buf); pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); return 2; } case 3: { /* 3-byte signed integer */ - i = 65536*(signed char)buf[0] | (buf[1]<<8) | buf[2]; - pMem->u.i = (i64)i; + pMem->u.i = THREE_BYTE_INT(buf); pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); return 3; } case 4: { /* 4-byte signed integer */ - y = ((unsigned)buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; + y = FOUR_BYTE_UINT(buf); pMem->u.i = (i64)*(int*)&y; pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); return 4; } case 5: { /* 6-byte signed integer */ - x = 256*(signed char)buf[0] + buf[1]; - y = ((unsigned)buf[2]<<24) | (buf[3]<<16) | (buf[4]<<8) | buf[5]; - x = (x<<32) | y; - pMem->u.i = *(i64*)&x; + pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf); pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); return 6; } case 6: /* 8-byte signed integer */ @@ -64282,12 +64358,13 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( swapMixedEndianFloat(t2); assert( sizeof(r1)==sizeof(t2) && memcmp(&r1, &t2, sizeof(r1))==0 ); #endif - x = ((unsigned)buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; - y = ((unsigned)buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7]; + x = FOUR_BYTE_UINT(buf); + y = FOUR_BYTE_UINT(buf+4); x = (x<<32) | y; if( serial_type==6 ){ pMem->u.i = *(i64*)&x; pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); }else{ assert( sizeof(x)==8 && sizeof(pMem->r)==8 ); swapMixedEndianFloat(x); @@ -64379,7 +64456,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( u32 szHdr; Mem *pMem = p->aMem; - p->flags = 0; + p->default_rc = 0; assert( EIGHT_BYTE_ALIGNMENT(pMem) ); idx = getVarint32(aKey, szHdr); d = szHdr; @@ -64400,26 +64477,18 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( p->nField = u; } +#if SQLITE_DEBUG /* -** This function compares the two table rows or index records -** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero -** or positive integer if key1 is less than, equal to or -** greater than key2. The {nKey1, pKey1} key must be a blob -** created by th OP_MakeRecord opcode of the VDBE. The pPKey2 -** key must be a parsed key such as obtained from -** sqlite3VdbeParseRecord. -** -** Key1 and Key2 do not have to contain the same number of fields. -** The key with fewer fields is usually compares less than the -** longer key. However if the UNPACKED_INCRKEY flags in pPKey2 is set -** and the common prefixes are equal, then key1 is less than key2. -** Or if the UNPACKED_MATCH_PREFIX flag is set and the prefixes are -** equal, then the keys are considered to be equal and -** the parts beyond the common prefix are ignored. +** This function compares two index or table record keys in the same way +** as the sqlite3VdbeRecordCompare() routine. Unlike VdbeRecordCompare(), +** this function deserializes and compares values using the +** sqlite3VdbeSerialGet() and sqlite3MemCompare() functions. It is used +** in assert() statements to ensure that the optimized code in +** sqlite3VdbeRecordCompare() returns results with these two primitives. */ -SQLITE_PRIVATE int sqlite3VdbeRecordCompare( +static int vdbeRecordCompareDebug( int nKey1, const void *pKey1, /* Left key */ - UnpackedRecord *pPKey2 /* Right key */ + const UnpackedRecord *pPKey2 /* Right key */ ){ u32 d1; /* Offset into aKey[] of next data element */ u32 idx1; /* Offset into aKey[] of next header element */ @@ -64493,24 +64562,576 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare( assert( mem1.zMalloc==0 ); /* rc==0 here means that one of the keys ran out of fields and - ** all the fields up to that point were equal. If the UNPACKED_INCRKEY - ** flag is set, then break the tie by treating key2 as larger. - ** If the UPACKED_PREFIX_MATCH flag is set, then keys with common prefixes - ** are considered to be equal. Otherwise, the longer key is the - ** larger. As it happens, the pPKey2 will always be the longer - ** if there is a difference. + ** all the fields up to that point were equal. Return the the default_rc + ** value. */ + return pPKey2->default_rc; +} +#endif + +/* +** Both *pMem1 and *pMem2 contain string values. Compare the two values +** using the collation sequence pColl. As usual, return a negative , zero +** or positive value if *pMem1 is less than, equal to or greater than +** *pMem2, respectively. Similar in spirit to "rc = (*pMem1) - (*pMem2);". +*/ +static int vdbeCompareMemString( + const Mem *pMem1, + const Mem *pMem2, + const CollSeq *pColl +){ + if( pMem1->enc==pColl->enc ){ + /* The strings are already in the correct encoding. Call the + ** comparison function directly */ + return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z); + }else{ + int rc; + const void *v1, *v2; + int n1, n2; + Mem c1; + Mem c2; + memset(&c1, 0, sizeof(c1)); + memset(&c2, 0, sizeof(c2)); + sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); + sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); + v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); + n1 = v1==0 ? 0 : c1.n; + v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); + n2 = v2==0 ? 0 : c2.n; + rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2); + sqlite3VdbeMemRelease(&c1); + sqlite3VdbeMemRelease(&c2); + return rc; + } +} + +/* +** Compare the values contained by the two memory cells, returning +** negative, zero or positive if pMem1 is less than, equal to, or greater +** than pMem2. Sorting order is NULL's first, followed by numbers (integers +** and reals) sorted numerically, followed by text ordered by the collating +** sequence pColl and finally blob's ordered by memcmp(). +** +** Two NULL values are considered equal by this function. +*/ +SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){ + int rc; + int f1, f2; + int combined_flags; + + f1 = pMem1->flags; + f2 = pMem2->flags; + combined_flags = f1|f2; + assert( (combined_flags & MEM_RowSet)==0 ); + + /* If one value is NULL, it is less than the other. If both values + ** are NULL, return 0. */ - assert( rc==0 ); - if( pPKey2->flags & UNPACKED_INCRKEY ){ - rc = -1; - }else if( pPKey2->flags & UNPACKED_PREFIX_MATCH ){ - /* Leave rc==0 */ - }else if( idx1u.i < pMem2->u.i ) return -1; + if( pMem1->u.i > pMem2->u.i ) return 1; + return 0; + } + if( (f1&MEM_Real)!=0 ){ + r1 = pMem1->r; + }else if( (f1&MEM_Int)!=0 ){ + r1 = (double)pMem1->u.i; + }else{ + return 1; + } + if( (f2&MEM_Real)!=0 ){ + r2 = pMem2->r; + }else if( (f2&MEM_Int)!=0 ){ + r2 = (double)pMem2->u.i; + }else{ + return -1; + } + if( r1r2 ) return 1; + return 0; + } + + /* If one value is a string and the other is a blob, the string is less. + ** If both are strings, compare using the collating functions. + */ + if( combined_flags&MEM_Str ){ + if( (f1 & MEM_Str)==0 ){ + return 1; + } + if( (f2 & MEM_Str)==0 ){ + return -1; + } + + assert( pMem1->enc==pMem2->enc ); + assert( pMem1->enc==SQLITE_UTF8 || + pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); + + /* The collation sequence must be defined at this point, even if + ** the user deletes the collation sequence after the vdbe program is + ** compiled (this was not always the case). + */ + assert( !pColl || pColl->xCmp ); + + if( pColl ){ + return vdbeCompareMemString(pMem1, pMem2, pColl); + } + /* If a NULL pointer was passed as the collate function, fall through + ** to the blob case and use memcmp(). */ + } + + /* Both values must be blobs. Compare using memcmp(). */ + rc = memcmp(pMem1->z, pMem2->z, (pMem1->n>pMem2->n)?pMem2->n:pMem1->n); + if( rc==0 ){ + rc = pMem1->n - pMem2->n; } return rc; } - + + +/* +** The first argument passed to this function is a serial-type that +** corresponds to an integer - all values between 1 and 9 inclusive +** except 7. The second points to a buffer containing an integer value +** serialized according to serial_type. This function deserializes +** and returns the value. +*/ +static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ + u32 y; + assert( CORRUPT_DB || (serial_type>=1 && serial_type<=9 && serial_type!=7) ); + switch( serial_type ){ + case 0: + case 1: + testcase( aKey[0]&0x80 ); + return ONE_BYTE_INT(aKey); + case 2: + testcase( aKey[0]&0x80 ); + return TWO_BYTE_INT(aKey); + case 3: + testcase( aKey[0]&0x80 ); + return THREE_BYTE_INT(aKey); + case 4: { + testcase( aKey[0]&0x80 ); + y = FOUR_BYTE_UINT(aKey); + return (i64)*(int*)&y; + } + case 5: { + testcase( aKey[0]&0x80 ); + return FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + } + case 6: { + u64 x = FOUR_BYTE_UINT(aKey); + testcase( aKey[0]&0x80 ); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + return (i64)*(i64*)&x; + } + } + + return (serial_type - 8); +} + +/* +** This function compares the two table rows or index records +** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero +** or positive integer if key1 is less than, equal to or +** greater than key2. The {nKey1, pKey1} key must be a blob +** created by th OP_MakeRecord opcode of the VDBE. The pPKey2 +** key must be a parsed key such as obtained from +** sqlite3VdbeParseRecord. +** +** If argument bSkip is non-zero, it is assumed that the caller has already +** determined that the first fields of the keys are equal. +** +** Key1 and Key2 do not have to contain the same number of fields. If all +** fields that appear in both keys are equal, then pPKey2->default_rc is +** returned. +*/ +SQLITE_PRIVATE int sqlite3VdbeRecordCompare( + int nKey1, const void *pKey1, /* Left key */ + const UnpackedRecord *pPKey2, /* Right key */ + int bSkip /* If true, skip the first field */ +){ + u32 d1; /* Offset into aKey[] of next data element */ + int i; /* Index of next field to compare */ + u32 szHdr1; /* Size of record header in bytes */ + u32 idx1; /* Offset of first type in header */ + int rc = 0; /* Return value */ + Mem *pRhs = pPKey2->aMem; /* Next field of pPKey2 to compare */ + KeyInfo *pKeyInfo = pPKey2->pKeyInfo; + const unsigned char *aKey1 = (const unsigned char *)pKey1; + Mem mem1; + + /* If bSkip is true, then the caller has already determined that the first + ** two elements in the keys are equal. Fix the various stack variables so + ** that this routine begins comparing at the second field. */ + if( bSkip ){ + u32 s1; + idx1 = 1 + getVarint32(&aKey1[1], s1); + szHdr1 = aKey1[0]; + d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1); + i = 1; + pRhs++; + }else{ + idx1 = getVarint32(aKey1, szHdr1); + d1 = szHdr1; + i = 0; + } + + VVA_ONLY( mem1.zMalloc = 0; ) /* Only needed by assert() statements */ + assert( pPKey2->pKeyInfo->nField+pPKey2->pKeyInfo->nXField>=pPKey2->nField + || CORRUPT_DB ); + assert( pPKey2->pKeyInfo->aSortOrder!=0 ); + assert( pPKey2->pKeyInfo->nField>0 ); + assert( idx1<=szHdr1 || CORRUPT_DB ); + do{ + u32 serial_type; + + /* RHS is an integer */ + if( pRhs->flags & MEM_Int ){ + serial_type = aKey1[idx1]; + testcase( serial_type==12 ); + if( serial_type>=12 ){ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else if( serial_type==7 ){ + double rhs = (double)pRhs->u.i; + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + if( mem1.rrhs ){ + rc = +1; + } + }else{ + i64 lhs = vdbeRecordDecodeInt(serial_type, &aKey1[d1]); + i64 rhs = pRhs->u.i; + if( lhsrhs ){ + rc = +1; + } + } + } + + /* RHS is real */ + else if( pRhs->flags & MEM_Real ){ + serial_type = aKey1[idx1]; + if( serial_type>=12 ){ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else{ + double rhs = pRhs->r; + double lhs; + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + if( serial_type==7 ){ + lhs = mem1.r; + }else{ + lhs = (double)mem1.u.i; + } + if( lhsrhs ){ + rc = +1; + } + } + } + + /* RHS is a string */ + else if( pRhs->flags & MEM_Str ){ + getVarint32(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 ){ + rc = -1; + }else if( !(serial_type & 0x01) ){ + rc = +1; + }else{ + mem1.n = (serial_type - 12) / 2; + testcase( (d1+mem1.n)==(unsigned)nKey1 ); + testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); + if( (d1+mem1.n) > (unsigned)nKey1 ){ + rc = 1; /* Corruption */ + }else if( pKeyInfo->aColl[i] ){ + mem1.enc = pKeyInfo->enc; + mem1.db = pKeyInfo->db; + mem1.flags = MEM_Str; + mem1.z = (char*)&aKey1[d1]; + rc = vdbeCompareMemString(&mem1, pRhs, pKeyInfo->aColl[i]); + }else{ + int nCmp = MIN(mem1.n, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = mem1.n - pRhs->n; + } + } + } + + /* RHS is a blob */ + else if( pRhs->flags & MEM_Blob ){ + getVarint32(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 || (serial_type & 0x01) ){ + rc = -1; + }else{ + int nStr = (serial_type - 12) / 2; + testcase( (d1+nStr)==(unsigned)nKey1 ); + testcase( (d1+nStr+1)==(unsigned)nKey1 ); + if( (d1+nStr) > (unsigned)nKey1 ){ + rc = 1; /* Corruption */ + }else{ + int nCmp = MIN(nStr, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = nStr - pRhs->n; + } + } + } + + /* RHS is null */ + else{ + serial_type = aKey1[idx1]; + rc = (serial_type!=0); + } + + if( rc!=0 ){ + if( pKeyInfo->aSortOrder[i] ){ + rc = -rc; + } + assert( CORRUPT_DB + || (rc<0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)<0) + || (rc>0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)>0) + || pKeyInfo->db->mallocFailed + ); + assert( mem1.zMalloc==0 ); /* See comment below */ + return rc; + } + + i++; + pRhs++; + d1 += sqlite3VdbeSerialTypeLen(serial_type); + idx1 += sqlite3VarintLen(serial_type); + }while( idx1<(unsigned)szHdr1 && inField && d1<=(unsigned)nKey1 ); + + /* No memory allocation is ever used on mem1. Prove this using + ** the following assert(). If the assert() fails, it indicates a + ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). */ + assert( mem1.zMalloc==0 ); + + /* rc==0 here means that one or both of the keys ran out of fields and + ** all the fields up to that point were equal. Return the the default_rc + ** value. */ + assert( CORRUPT_DB + || pPKey2->default_rc==vdbeRecordCompareDebug(nKey1, pKey1, pPKey2) + ); + return pPKey2->default_rc; +} + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is an integer, and (b) the +** size-of-header varint at the start of (pKey1/nKey1) fits in a single +** byte (i.e. is less than 128). +*/ +static int vdbeRecordCompareInt( + int nKey1, const void *pKey1, /* Left key */ + const UnpackedRecord *pPKey2, /* Right key */ + int bSkip /* Ignored */ +){ + const u8 *aKey = &((const u8*)pKey1)[*(const u8*)pKey1 & 0x3F]; + int serial_type = ((const u8*)pKey1)[1]; + int res; + u32 y; + u64 x; + i64 v = pPKey2->aMem[0].u.i; + i64 lhs; + UNUSED_PARAMETER(bSkip); + + assert( bSkip==0 ); + switch( serial_type ){ + case 1: { /* 1-byte signed integer */ + lhs = ONE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 2: { /* 2-byte signed integer */ + lhs = TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 3: { /* 3-byte signed integer */ + lhs = THREE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 4: { /* 4-byte signed integer */ + y = FOUR_BYTE_UINT(aKey); + lhs = (i64)*(int*)&y; + testcase( lhs<0 ); + break; + } + case 5: { /* 6-byte signed integer */ + lhs = FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 6: { /* 8-byte signed integer */ + x = FOUR_BYTE_UINT(aKey); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + lhs = *(i64*)&x; + testcase( lhs<0 ); + break; + } + case 8: + lhs = 0; + break; + case 9: + lhs = 1; + break; + + /* This case could be removed without changing the results of running + ** this code. Including it causes gcc to generate a faster switch + ** statement (since the range of switch targets now starts at zero and + ** is contiguous) but does not cause any duplicate code to be generated + ** (as gcc is clever enough to combine the two like cases). Other + ** compilers might be similar. */ + case 0: case 7: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2, 0); + + default: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2, 0); + } + + if( v>lhs ){ + res = pPKey2->r1; + }else if( vr2; + }else if( pPKey2->nField>1 ){ + /* The first fields of the two keys are equal. Compare the trailing + ** fields. */ + res = sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2, 1); + }else{ + /* The first fields of the two keys are equal and there are no trailing + ** fields. Return pPKey2->default_rc in this case. */ + res = pPKey2->default_rc; + } + + assert( (res==0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)==0) + || (res<0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)<0) + || (res>0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)>0) + || CORRUPT_DB + ); + return res; +} + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is a string, that (b) the first field +** uses the collation sequence BINARY and (c) that the size-of-header varint +** at the start of (pKey1/nKey1) fits in a single byte. +*/ +static int vdbeRecordCompareString( + int nKey1, const void *pKey1, /* Left key */ + const UnpackedRecord *pPKey2, /* Right key */ + int bSkip +){ + const u8 *aKey1 = (const u8*)pKey1; + int serial_type; + int res; + UNUSED_PARAMETER(bSkip); + + assert( bSkip==0 ); + getVarint32(&aKey1[1], serial_type); + + if( serial_type<12 ){ + res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ + }else if( !(serial_type & 0x01) ){ + res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ + }else{ + int nCmp; + int nStr; + int szHdr = aKey1[0]; + + nStr = (serial_type-12) / 2; + if( (szHdr + nStr) > nKey1 ) return 0; /* Corruption */ + nCmp = MIN( pPKey2->aMem[0].n, nStr ); + res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); + + if( res==0 ){ + res = nStr - pPKey2->aMem[0].n; + if( res==0 ){ + if( pPKey2->nField>1 ){ + res = sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2, 1); + }else{ + res = pPKey2->default_rc; + } + }else if( res>0 ){ + res = pPKey2->r2; + }else{ + res = pPKey2->r1; + } + }else if( res>0 ){ + res = pPKey2->r2; + }else{ + res = pPKey2->r1; + } + } + + assert( (res==0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)==0) + || (res<0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)<0) + || (res>0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)>0) + || CORRUPT_DB + ); + return res; +} + +/* +** Return a pointer to an sqlite3VdbeRecordCompare() compatible function +** suitable for comparing serialized records to the unpacked record passed +** as the only argument. +*/ +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ + /* varintRecordCompareInt() and varintRecordCompareString() both assume + ** that the size-of-header varint that occurs at the start of each record + ** fits in a single byte (i.e. is 127 or less). varintRecordCompareInt() + ** also assumes that it is safe to overread a buffer by at least the + ** maximum possible legal header size plus 8 bytes. Because there is + ** guaranteed to be at least 74 (but not 136) bytes of padding following each + ** buffer passed to varintRecordCompareInt() this makes it convenient to + ** limit the size of the header to 64 bytes in cases where the first field + ** is an integer. + ** + ** The easiest way to enforce this limit is to consider only records with + ** 13 fields or less. If the first field is an integer, the maximum legal + ** header size is (12*5 + 1 + 1) bytes. */ + if( (p->pKeyInfo->nField + p->pKeyInfo->nXField)<=13 ){ + int flags = p->aMem[0].flags; + if( p->pKeyInfo->aSortOrder[0] ){ + p->r1 = 1; + p->r2 = -1; + }else{ + p->r1 = -1; + p->r2 = 1; + } + if( (flags & MEM_Int) ){ + return vdbeRecordCompareInt; + } + testcase( flags & MEM_Real ); + testcase( flags & MEM_Null ); + testcase( flags & MEM_Blob ); + if( (flags & (MEM_Real|MEM_Null|MEM_Blob))==0 && p->pKeyInfo->aColl[0]==0 ){ + assert( flags & MEM_Str ); + return vdbeRecordCompareString; + } + } + + return sqlite3VdbeRecordCompare; +} /* ** pCur points at an index entry created using the OP_MakeRecord opcode. @@ -64601,9 +65222,9 @@ idx_rowid_corruption: ** of the keys prior to the final rowid, not the entire key. */ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( - VdbeCursor *pC, /* The cursor to compare against */ - UnpackedRecord *pUnpacked, /* Unpacked version of key to compare against */ - int *res /* Write the comparison result here */ + VdbeCursor *pC, /* The cursor to compare against */ + const UnpackedRecord *pUnpacked, /* Unpacked version of key */ + int *res /* Write the comparison result here */ ){ i64 nCellKey = 0; int rc; @@ -64613,7 +65234,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( assert( sqlite3BtreeCursorIsValid(pCur) ); VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey); assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */ - /* nCellKey will always be between 0 and 0xffffffff because of the say + /* nCellKey will always be between 0 and 0xffffffff because of the way ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ if( nCellKey<=0 || nCellKey>0x7fffffff ){ *res = 0; @@ -64624,8 +65245,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( if( rc ){ return rc; } - assert( pUnpacked->flags & UNPACKED_PREFIX_MATCH ); - *res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked); + *res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked, 0); sqlite3VdbeMemRelease(&m); return SQLITE_OK; } @@ -64689,7 +65309,6 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff if( pRet ){ sqlite3VdbeMemCopy((Mem *)pRet, pMem); sqlite3ValueApplyAffinity(pRet, aff, SQLITE_UTF8); - sqlite3VdbeMemStoreType((Mem *)pRet); } return pRet; } @@ -64863,7 +65482,6 @@ SQLITE_API const void *sqlite3_value_blob(sqlite3_value *pVal){ Mem *p = (Mem*)pVal; if( p->flags & (MEM_Blob|MEM_Str) ){ sqlite3VdbeMemExpandBlob(p); - p->flags &= ~MEM_Str; p->flags |= MEM_Blob; return p->n ? p->z : 0; }else{ @@ -64900,7 +65518,41 @@ SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){ } #endif /* SQLITE_OMIT_UTF16 */ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ - return pVal->type; + static const u8 aType[] = { + SQLITE_BLOB, /* 0x00 */ + SQLITE_NULL, /* 0x01 */ + SQLITE_TEXT, /* 0x02 */ + SQLITE_NULL, /* 0x03 */ + SQLITE_INTEGER, /* 0x04 */ + SQLITE_NULL, /* 0x05 */ + SQLITE_INTEGER, /* 0x06 */ + SQLITE_NULL, /* 0x07 */ + SQLITE_FLOAT, /* 0x08 */ + SQLITE_NULL, /* 0x09 */ + SQLITE_FLOAT, /* 0x0a */ + SQLITE_NULL, /* 0x0b */ + SQLITE_INTEGER, /* 0x0c */ + SQLITE_NULL, /* 0x0d */ + SQLITE_INTEGER, /* 0x0e */ + SQLITE_NULL, /* 0x0f */ + SQLITE_BLOB, /* 0x10 */ + SQLITE_NULL, /* 0x11 */ + SQLITE_TEXT, /* 0x12 */ + SQLITE_NULL, /* 0x13 */ + SQLITE_INTEGER, /* 0x14 */ + SQLITE_NULL, /* 0x15 */ + SQLITE_INTEGER, /* 0x16 */ + SQLITE_NULL, /* 0x17 */ + SQLITE_FLOAT, /* 0x18 */ + SQLITE_NULL, /* 0x19 */ + SQLITE_FLOAT, /* 0x1a */ + SQLITE_NULL, /* 0x1b */ + SQLITE_INTEGER, /* 0x1c */ + SQLITE_NULL, /* 0x1d */ + SQLITE_INTEGER, /* 0x1e */ + SQLITE_NULL, /* 0x1f */ + }; + return aType[pVal->flags&MEM_AffMask]; } /**************************** sqlite3_result_ ******************************* @@ -65421,6 +66073,30 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt){ return pVm->nResColumn; } +/* +** Return a pointer to static memory containing an SQL NULL value. +*/ +static const Mem *columnNullValue(void){ + /* Even though the Mem structure contains an element + ** of type i64, on certain architectures (x86) with certain compiler + ** switches (-Os), gcc may align this Mem object on a 4-byte boundary + ** instead of an 8-byte one. This all works fine, except that when + ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s + ** that a Mem structure is located on an 8-byte boundary. To prevent + ** these assert()s from failing, when building with SQLITE_DEBUG defined + ** using gcc, we force nullMem to be 8-byte aligned using the magical + ** __attribute__((aligned(8))) macro. */ + static const Mem nullMem +#if defined(SQLITE_DEBUG) && defined(__GNUC__) + __attribute__((aligned(8))) +#endif + = {0, "", (double)0, {0}, 0, MEM_Null, 0, +#ifdef SQLITE_DEBUG + 0, 0, /* pScopyFrom, pFiller */ +#endif + 0, 0 }; + return &nullMem; +} /* ** Check to see if column iCol of the given statement is valid. If @@ -65437,32 +66113,11 @@ static Mem *columnMem(sqlite3_stmt *pStmt, int i){ sqlite3_mutex_enter(pVm->db->mutex); pOut = &pVm->pResultSet[i]; }else{ - /* If the value passed as the second argument is out of range, return - ** a pointer to the following static Mem object which contains the - ** value SQL NULL. Even though the Mem structure contains an element - ** of type i64, on certain architectures (x86) with certain compiler - ** switches (-Os), gcc may align this Mem object on a 4-byte boundary - ** instead of an 8-byte one. This all works fine, except that when - ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s - ** that a Mem structure is located on an 8-byte boundary. To prevent - ** these assert()s from failing, when building with SQLITE_DEBUG defined - ** using gcc, we force nullMem to be 8-byte aligned using the magical - ** __attribute__((aligned(8))) macro. */ - static const Mem nullMem -#if defined(SQLITE_DEBUG) && defined(__GNUC__) - __attribute__((aligned(8))) -#endif - = {0, "", (double)0, {0}, 0, MEM_Null, SQLITE_NULL, 0, -#ifdef SQLITE_DEBUG - 0, 0, /* pScopyFrom, pFiller */ -#endif - 0, 0 }; - if( pVm && ALWAYS(pVm->db) ){ sqlite3_mutex_enter(pVm->db->mutex); sqlite3Error(pVm->db, SQLITE_RANGE, 0); } - pOut = (Mem*)&nullMem; + pOut = (Mem*)columnNullValue(); } return pOut; } @@ -65859,7 +66514,7 @@ SQLITE_API int sqlite3_bind_text16( #endif /* SQLITE_OMIT_UTF16 */ SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ int rc; - switch( pValue->type ){ + switch( sqlite3_value_type((sqlite3_value*)pValue) ){ case SQLITE_INTEGER: { rc = sqlite3_bind_int64(pStmt, i, pValue->u.i); break; @@ -66360,33 +67015,8 @@ SQLITE_PRIVATE const char *sqlite3VdbeExplanation(Vdbe *pVdbe){ ** May you share freely, never taking more than you give. ** ************************************************************************* -** The code in this file implements execution method of the -** Virtual Database Engine (VDBE). A separate file ("vdbeaux.c") -** handles housekeeping details such as creating and deleting -** VDBE instances. This file is solely interested in executing -** the VDBE program. -** -** In the external interface, an "sqlite3_stmt*" is an opaque pointer -** to a VDBE. -** -** The SQL parser generates a program which is then executed by -** the VDBE to do the work of the SQL statement. VDBE programs are -** similar in form to assembly language. The program consists of -** a linear sequence of operations. Each operation has an opcode -** and 5 operands. Operands P1, P2, and P3 are integers. Operand P4 -** is a null-terminated string. Operand P5 is an unsigned character. -** Few opcodes use all 5 operands. -** -** Computation results are stored on a set of registers numbered beginning -** with 1 and going up to Vdbe.nMem. Each register can store -** either an integer, a null-terminated string, a floating point -** number, or the SQL "NULL" value. An implicit conversion from one -** type to the other occurs as necessary. -** -** Most of the code in this file is taken up by the sqlite3VdbeExec() -** function which does the work of interpreting a VDBE program. -** But other routines are also provided to help in building up -** a program instruction by instruction. +** The code in this file implements the function that runs the +** bytecode of a prepared statement. ** ** Various scripts scan this source file in order to generate HTML ** documentation, headers files, or other derived files. The formatting @@ -66398,7 +67028,11 @@ SQLITE_PRIVATE const char *sqlite3VdbeExplanation(Vdbe *pVdbe){ /* ** Invoke this macro on memory cells just prior to changing the ** value of the cell. This macro verifies that shallow copies are -** not misused. +** not misused. A shallow copy of a string or blob just copies a +** pointer to the string or blob, not the content. If the original +** is changed while the copy is still in use, the string or blob might +** be changed out from under the copy. This macro verifies that nothing +** like that ever happens. */ #ifdef SQLITE_DEBUG # define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M) @@ -66457,7 +67091,7 @@ static void updateMaxBlobsize(Mem *p){ #endif /* -** The next global variable is incremented each type the OP_Found opcode +** The next global variable is incremented each time the OP_Found opcode ** is executed. This is used to test whether or not the foreign key ** operation implemented using OP_FkIsZero is working. This variable ** has no function other than to help verify the correct operation of the @@ -66477,6 +67111,34 @@ SQLITE_API int sqlite3_found_count = 0; # define UPDATE_MAX_BLOBSIZE(P) #endif +/* +** Invoke the VDBE coverage callback, if that callback is defined. This +** feature is used for test suite validation only and does not appear an +** production builds. +** +** M is an integer, 2 or 3, that indices how many different ways the +** branch can go. It is usually 2. "I" is the direction the branch +** goes. 0 means falls through. 1 means branch is taken. 2 means the +** second alternative branch is taken. +*/ +#if !defined(SQLITE_VDBE_COVERAGE) +# define VdbeBranchTaken(I,M) +#else +# define VdbeBranchTaken(I,M) vdbeTakeBranch(pOp->iSrcLine,I,M) + static void vdbeTakeBranch(int iSrcLine, u8 I, u8 M){ + if( iSrcLine<=2 && ALWAYS(iSrcLine>0) ){ + M = iSrcLine; + /* Assert the truth of VdbeCoverageAlwaysTaken() and + ** VdbeCoverageNeverTaken() */ + assert( (M & I)==I ); + }else{ + if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/ + sqlite3GlobalConfig.xVdbeBranch(sqlite3GlobalConfig.pVdbeBranchArg, + iSrcLine,I,M); + } + } +#endif + /* ** Convert the given register into a string if it isn't one ** already. Return non-zero if a malloc() fails. @@ -66494,38 +67156,14 @@ SQLITE_API int sqlite3_found_count = 0; ** ** This routine converts an ephemeral string into a dynamically allocated ** string that the register itself controls. In other words, it -** converts an MEM_Ephem string into an MEM_Dyn string. +** converts an MEM_Ephem string into a string with P.z==P.zMalloc. */ #define Deephemeralize(P) \ if( ((P)->flags&MEM_Ephem)!=0 \ && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;} /* Return true if the cursor was opened using the OP_OpenSorter opcode. */ -# define isSorter(x) ((x)->pSorter!=0) - -/* -** Argument pMem points at a register that will be passed to a -** user-defined function or returned to the user as the result of a query. -** This routine sets the pMem->type variable used by the sqlite3_value_*() -** routines. -*/ -SQLITE_PRIVATE void sqlite3VdbeMemStoreType(Mem *pMem){ - int flags = pMem->flags; - if( flags & MEM_Null ){ - pMem->type = SQLITE_NULL; - } - else if( flags & MEM_Int ){ - pMem->type = SQLITE_INTEGER; - } - else if( flags & MEM_Real ){ - pMem->type = SQLITE_FLOAT; - } - else if( flags & MEM_Str ){ - pMem->type = SQLITE_TEXT; - }else{ - pMem->type = SQLITE_BLOB; - } -} +#define isSorter(x) ((x)->pSorter!=0) /* ** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL @@ -66655,12 +67293,13 @@ static void applyAffinity( ** loss of information and return the revised type of the argument. */ SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){ - Mem *pMem = (Mem*)pVal; - if( pMem->type==SQLITE_TEXT ){ + int eType = sqlite3_value_type(pVal); + if( eType==SQLITE_TEXT ){ + Mem *pMem = (Mem*)pVal; applyNumericAffinity(pMem); - sqlite3VdbeMemStoreType(pMem); + eType = sqlite3_value_type(pVal); } - return pMem->type; + return eType; } /* @@ -66763,7 +67402,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ ** Print the value of a register for tracing purposes: */ static void memTracePrint(Mem *p){ - if( p->flags & MEM_Invalid ){ + if( p->flags & MEM_Undefined ){ printf(" undefined"); }else if( p->flags & MEM_Null ){ printf(" NULL"); @@ -66896,20 +67535,6 @@ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } #endif -/* -** The CHECK_FOR_INTERRUPT macro defined here looks to see if the -** sqlite3_interrupt() routine has been called. If it has been, then -** processing of the VDBE program is interrupted. -** -** This macro added to every instruction that does a jump in order to -** implement a loop. This test used to be on every single instruction, -** but that meant we more testing than we needed. By only testing the -** flag on jump instructions, we get a (small) speed improvement. -*/ -#define CHECK_FOR_INTERRUPT \ - if( db->u1.isInterrupted ) goto abort_due_to_interrupt; - - #ifndef NDEBUG /* ** This function is only called from within an assert() expression. It @@ -66932,35 +67557,8 @@ static int checkSavepointCount(sqlite3 *db){ /* -** Execute as much of a VDBE program as we can then return. -** -** sqlite3VdbeMakeReady() must be called before this routine in order to -** close the program with a final OP_Halt and to set up the callbacks -** and the error message pointer. -** -** Whenever a row or result data is available, this routine will either -** invoke the result callback (if there is one) or return with -** SQLITE_ROW. -** -** If an attempt is made to open a locked database, then this routine -** will either invoke the busy callback (if there is one) or it will -** return SQLITE_BUSY. -** -** If an error occurs, an error message is written to memory obtained -** from sqlite3_malloc() and p->zErrMsg is made to point to that memory. -** The error code is stored in p->rc and this routine returns SQLITE_ERROR. -** -** If the callback ever returns non-zero, then the program exits -** immediately. There will be no error message but the p->rc field is -** set to SQLITE_ABORT and this routine will return SQLITE_ERROR. -** -** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this -** routine to return SQLITE_ERROR. -** -** Other fatal errors return SQLITE_ERROR. -** -** After this routine has finished, sqlite3VdbeFinalize() should be -** used to clean up the mess that was left behind. +** Execute as much of a VDBE program as we can. +** This is the core of sqlite3_step(). */ SQLITE_PRIVATE int sqlite3VdbeExec( Vdbe *p /* The VDBE */ @@ -66986,7 +67584,6 @@ SQLITE_PRIVATE int sqlite3VdbeExec( i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */ #ifdef VDBE_PROFILE u64 start; /* CPU clock count at start of opcode */ - int origPc; /* Program counter at start of opcode */ #endif /*** INSERT STACK UNION HERE ***/ @@ -67004,7 +67601,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( assert( p->explain==0 ); p->pResultSet = 0; db->busyHandler.nBusy = 0; - CHECK_FOR_INTERRUPT; + if( db->u1.isInterrupted ) goto abort_due_to_interrupt; sqlite3VdbeIOTraceSql(p); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK if( db->xProgress ){ @@ -67048,7 +67645,6 @@ SQLITE_PRIVATE int sqlite3VdbeExec( assert( pc>=0 && pcnOp ); if( db->mallocFailed ) goto no_mem; #ifdef VDBE_PROFILE - origPc = pc; start = sqlite3Hwtime(); #endif nVmStep++; @@ -67096,18 +67692,21 @@ SQLITE_PRIVATE int sqlite3VdbeExec( assert( pOp->p1>0 ); assert( pOp->p1<=(p->nMem-p->nCursor) ); assert( memIsValid(&aMem[pOp->p1]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p1]) ); REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]); } if( (pOp->opflags & OPFLG_IN2)!=0 ){ assert( pOp->p2>0 ); assert( pOp->p2<=(p->nMem-p->nCursor) ); assert( memIsValid(&aMem[pOp->p2]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p2]) ); REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]); } if( (pOp->opflags & OPFLG_IN3)!=0 ){ assert( pOp->p3>0 ); assert( pOp->p3<=(p->nMem-p->nCursor) ); assert( memIsValid(&aMem[pOp->p3]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p3]) ); REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]); } if( (pOp->opflags & OPFLG_OUT2)!=0 ){ @@ -67165,6 +67764,11 @@ SQLITE_PRIVATE int sqlite3VdbeExec( ** The next instruction executed will be ** the one at index P2 from the beginning of ** the program. +** +** The P1 parameter is not actually used by this opcode. However, it +** is sometimes set to 1 instead of 0 as a hint to the command-line shell +** that this Goto is the bottom of a loop and that the lines from P2 down +** to the current line should be indented for EXPLAIN output. */ case OP_Goto: { /* jump */ pc = pOp->p2 - 1; @@ -67180,7 +67784,7 @@ case OP_Goto: { /* jump */ ** checks on every opcode. This helps sqlite3_step() to run about 1.5% ** faster according to "valgrind --tool=cachegrind" */ check_for_interrupt: - CHECK_FOR_INTERRUPT; + if( db->u1.isInterrupted ) goto abort_due_to_interrupt; #ifndef SQLITE_OMIT_PROGRESS_CALLBACK /* Call the progress callback if it is configured and the required number ** of VDBE ops have been executed (either since this invocation of @@ -67209,7 +67813,7 @@ check_for_interrupt: case OP_Gosub: { /* jump */ assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); pIn1 = &aMem[pOp->p1]; - assert( (pIn1->flags & MEM_Dyn)==0 ); + assert( VdbeMemDynamic(pIn1)==0 ); memAboutToChange(p, pIn1); pIn1->flags = MEM_Int; pIn1->u.i = pc; @@ -67220,23 +67824,69 @@ case OP_Gosub: { /* jump */ /* Opcode: Return P1 * * * * ** -** Jump to the next instruction after the address in register P1. +** Jump to the next instruction after the address in register P1. After +** the jump, register P1 becomes undefined. */ case OP_Return: { /* in1 */ pIn1 = &aMem[pOp->p1]; - assert( pIn1->flags & MEM_Int ); + assert( pIn1->flags==MEM_Int ); pc = (int)pIn1->u.i; + pIn1->flags = MEM_Undefined; break; } -/* Opcode: Yield P1 * * * * +/* Opcode: InitCoroutine P1 P2 P3 * * +** +** Set up register P1 so that it will OP_Yield to the co-routine +** located at address P3. +** +** If P2!=0 then the co-routine implementation immediately follows +** this opcode. So jump over the co-routine implementation to +** address P2. +*/ +case OP_InitCoroutine: { /* jump */ + assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); + assert( pOp->p2>=0 && pOp->p2nOp ); + assert( pOp->p3>=0 && pOp->p3nOp ); + pOut = &aMem[pOp->p1]; + assert( !VdbeMemDynamic(pOut) ); + pOut->u.i = pOp->p3 - 1; + pOut->flags = MEM_Int; + if( pOp->p2 ) pc = pOp->p2 - 1; + break; +} + +/* Opcode: EndCoroutine P1 * * * * +** +** The instruction at the address in register P1 is an OP_Yield. +** Jump to the P2 parameter of that OP_Yield. +** After the jump, register P1 becomes undefined. +*/ +case OP_EndCoroutine: { /* in1 */ + VdbeOp *pCaller; + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags==MEM_Int ); + assert( pIn1->u.i>=0 && pIn1->u.inOp ); + pCaller = &aOp[pIn1->u.i]; + assert( pCaller->opcode==OP_Yield ); + assert( pCaller->p2>=0 && pCaller->p2nOp ); + pc = pCaller->p2 - 1; + pIn1->flags = MEM_Undefined; + break; +} + +/* Opcode: Yield P1 P2 * * * ** ** Swap the program counter with the value in register P1. +** +** If the co-routine ends with OP_Yield or OP_Return then continue +** to the next instruction. But if the co-routine ends with +** OP_EndCoroutine, jump immediately to P2. */ -case OP_Yield: { /* in1 */ +case OP_Yield: { /* in1, jump */ int pcDest; pIn1 = &aMem[pOp->p1]; - assert( (pIn1->flags & MEM_Dyn)==0 ); + assert( VdbeMemDynamic(pIn1)==0 ); pIn1->flags = MEM_Int; pcDest = (int)pIn1->u.i; pIn1->u.i = pc; @@ -67246,7 +67896,7 @@ case OP_Yield: { /* in1 */ } /* Opcode: HaltIfNull P1 P2 P3 P4 P5 -** Synopsis: if r[P3] null then halt +** Synopsis: if r[P3]=null halt ** ** Check the value in register P3. If it is NULL then Halt using ** parameter P1, P2, and P4 as if this were a Halt instruction. If the @@ -67394,7 +68044,9 @@ case OP_Real: { /* same as TK_FLOAT, out2-prerelease */ ** Synopsis: r[P2]='P4' ** ** P4 points to a nul terminated UTF-8 string. This opcode is transformed -** into an OP_String before it is executed for the first time. +** into an OP_String before it is executed for the first time. During +** this transformation, the length of string P4 is computed and stored +** as the P1 parameter. */ case OP_String8: { /* same as TK_STRING, out2-prerelease */ assert( pOp->p4.z!=0 ); @@ -67407,10 +68059,9 @@ case OP_String8: { /* same as TK_STRING, out2-prerelease */ if( rc==SQLITE_TOOBIG ) goto too_big; if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; assert( pOut->zMalloc==pOut->z ); - assert( pOut->flags & MEM_Dyn ); + assert( VdbeMemDynamic(pOut)==0 ); pOut->zMalloc = 0; pOut->flags |= MEM_Static; - pOut->flags &= ~MEM_Dyn; if( pOp->p4type==P4_DYNAMIC ){ sqlite3DbFree(db, pOp->p4.z); } @@ -67468,8 +68119,22 @@ case OP_Null: { /* out2-prerelease */ break; } +/* Opcode: SoftNull P1 * * * * +** Synopsis: r[P1]=NULL +** +** Set register P1 to have the value NULL as seen by the OP_MakeRecord +** instruction, but do not free any string or blob memory associated with +** the register, so that if the value was a string or blob that was +** previously copied using OP_SCopy, the copies will continue to be valid. +*/ +case OP_SoftNull: { + assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); + pOut = &aMem[pOp->p1]; + pOut->flags = (pOut->flags|MEM_Null)&~MEM_Undefined; + break; +} -/* Opcode: Blob P1 P2 * P4 +/* Opcode: Blob P1 P2 * P4 * ** Synopsis: r[P2]=P4 (len=P1) ** ** P4 points to a blob of data P1 bytes long. Store this @@ -67488,7 +68153,7 @@ case OP_Blob: { /* out2-prerelease */ ** ** Transfer the values of bound parameter P1 into register P2 ** -** If the parameter is named, then its name appears in P4 and P3==1. +** If the parameter is named, then its name appears in P4. ** The P4 value is used by sqlite3_bind_parameter_name(). */ case OP_Variable: { /* out2-prerelease */ @@ -67532,14 +68197,16 @@ case OP_Move: { assert( pIn1<=&aMem[(p->nMem-p->nCursor)] ); assert( memIsValid(pIn1) ); memAboutToChange(p, pOut); + VdbeMemRelease(pOut); zMalloc = pOut->zMalloc; - pOut->zMalloc = 0; - sqlite3VdbeMemMove(pOut, pIn1); + memcpy(pOut, pIn1, sizeof(Mem)); #ifdef SQLITE_DEBUG if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrom<&aMem[p1+pOp->p3] ){ pOut->pScopyFrom += p1 - pOp->p2; } #endif + pIn1->flags = MEM_Undefined; + pIn1->xDel = 0; pIn1->zMalloc = zMalloc; REGISTER_TRACE(p2++, pOut); pIn1++; @@ -67607,8 +68274,8 @@ case OP_SCopy: { /* out2 */ ** The registers P1 through P1+P2-1 contain a single row of ** results. This opcode causes the sqlite3_step() call to terminate ** with an SQLITE_ROW return code and it sets up the sqlite3_stmt -** structure to provide access to the top P1 values as the result -** row. +** structure to provide access to the r(P1)..r(P1+P2-1) values as +** the result row. */ case OP_ResultRow: { Mem *pMem; @@ -67673,7 +68340,6 @@ case OP_ResultRow: { assert( (pMem[i].flags & MEM_Ephem)==0 || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); sqlite3VdbeMemNulTerminate(&pMem[i]); - sqlite3VdbeMemStoreType(&pMem[i]); REGISTER_TRACE(pOp->p1+i, &pMem[i]); } if( db->mallocFailed ) goto no_mem; @@ -67716,10 +68382,10 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } - MemSetTypeFlag(pOut, MEM_Str); if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ goto no_mem; } + MemSetTypeFlag(pOut, MEM_Str); if( pOut!=pIn2 ){ memcpy(pOut->z, pIn2->z, pIn2->n); } @@ -67919,7 +68585,6 @@ case OP_Function: { assert( memIsValid(pArg) ); apVal[i] = pArg; Deephemeralize(pArg); - sqlite3VdbeMemStoreType(pArg); REGISTER_TRACE(pOp->p2+i, pArg); } @@ -68098,6 +68763,7 @@ case OP_MustBeInt: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Int)==0 ){ applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); + VdbeBranchTaken((pIn1->flags&MEM_Int)==0, 2); if( (pIn1->flags & MEM_Int)==0 ){ if( pOp->p2==0 ){ rc = SQLITE_MISMATCH; @@ -68136,7 +68802,7 @@ case OP_RealAffinity: { /* in1 */ ** ** Force the value in register P1 to be text. ** If the value is numeric, convert it to a string using the -** equivalent of printf(). Blob values are unchanged and +** equivalent of sprintf(). Blob values are unchanged and ** are afterwards simply interpreted as text. ** ** A NULL value is not changed by this routine. It remains NULL. @@ -68338,6 +69004,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ */ assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); assert( (flags1 & MEM_Cleared)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 ); if( (flags1&MEM_Null)!=0 && (flags3&MEM_Null)!=0 && (flags3&MEM_Cleared)==0 @@ -68351,12 +69018,15 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** then the result is always NULL. ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. */ - if( pOp->p5 & SQLITE_JUMPIFNULL ){ - pc = pOp->p2-1; - }else if( pOp->p5 & SQLITE_STOREP2 ){ + if( pOp->p5 & SQLITE_STOREP2 ){ pOut = &aMem[pOp->p2]; MemSetTypeFlag(pOut, MEM_Null); REGISTER_TRACE(pOp->p2, pOut); + }else{ + VdbeBranchTaken(2,3); + if( pOp->p5 & SQLITE_JUMPIFNULL ){ + pc = pOp->p2-1; + } } break; } @@ -68389,10 +69059,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ MemSetTypeFlag(pOut, MEM_Int); pOut->u.i = res; REGISTER_TRACE(pOp->p2, pOut); - }else if( res ){ - pc = pOp->p2-1; + }else{ + VdbeBranchTaken(res!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); + if( res ){ + pc = pOp->p2-1; + } } - /* Undo any changes made by applyAffinity() to the input registers. */ pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (flags1&MEM_TypeMask); pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (flags3&MEM_TypeMask); @@ -68489,11 +69161,11 @@ case OP_Compare: { */ case OP_Jump: { /* jump */ if( iCompare<0 ){ - pc = pOp->p1 - 1; + pc = pOp->p1 - 1; VdbeBranchTaken(0,3); }else if( iCompare==0 ){ - pc = pOp->p2 - 1; + pc = pOp->p2 - 1; VdbeBranchTaken(1,3); }else{ - pc = pOp->p3 - 1; + pc = pOp->p3 - 1; VdbeBranchTaken(2,3); } break; } @@ -68591,10 +69263,13 @@ case OP_BitNot: { /* same as TK_BITNOT, in1, out2 */ /* Opcode: Once P1 P2 * * * ** ** Check if OP_Once flag P1 is set. If so, jump to instruction P2. Otherwise, -** set the flag and fall through to the next instruction. +** set the flag and fall through to the next instruction. In other words, +** this opcode causes all following opcodes up through P2 (but not including +** P2) to run just once and to be skipped on subsequent times through the loop. */ case OP_Once: { /* jump */ assert( pOp->p1nOnceFlag ); + VdbeBranchTaken(p->aOnceFlag[pOp->p1]!=0, 2); if( p->aOnceFlag[pOp->p1] ){ pc = pOp->p2-1; }else{ @@ -68629,6 +69304,7 @@ case OP_IfNot: { /* jump, in1 */ #endif if( pOp->opcode==OP_IfNot ) c = !c; } + VdbeBranchTaken(c!=0, 2); if( c ){ pc = pOp->p2-1; } @@ -68642,6 +69318,7 @@ case OP_IfNot: { /* jump, in1 */ */ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ pIn1 = &aMem[pOp->p1]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)!=0, 2); if( (pIn1->flags & MEM_Null)!=0 ){ pc = pOp->p2 - 1; } @@ -68655,6 +69332,7 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ */ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ pIn1 = &aMem[pOp->p1]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)==0, 2); if( (pIn1->flags & MEM_Null)==0 ){ pc = pOp->p2 - 1; } @@ -68731,11 +69409,6 @@ case OP_Column: { if( pCrsr==0 ){ assert( pC->pseudoTableReg>0 ); pReg = &aMem[pC->pseudoTableReg]; - if( pC->multiPseudo ){ - sqlite3VdbeMemShallowCopy(pDest, pReg+p2, MEM_Ephem); - Deephemeralize(pDest); - goto op_column_out; - } assert( pReg->flags & MEM_Blob ); assert( memIsValid(pReg) ); pC->payloadSize = pC->szRow = avail = pReg->n; @@ -68886,6 +69559,7 @@ case OP_Column: { */ assert( p2nHdrParsed ); assert( rc==SQLITE_OK ); + assert( sqlite3VdbeCheckMemInvariants(pDest) ); if( pC->szRow>=aOffset[p2+1] ){ /* This is the common case where the desired content fits on the original ** page - where the content is not on an overflow page */ @@ -68923,8 +69597,8 @@ case OP_Column: { ** This prevents a memory copy. */ if( sMem.zMalloc ){ assert( sMem.z==sMem.zMalloc ); - assert( !(pDest->flags & MEM_Dyn) ); - assert( !(pDest->flags & (MEM_Blob|MEM_Str)) || pDest->z==sMem.z ); + assert( VdbeMemDynamic(pDest)==0 ); + assert( (pDest->flags & (MEM_Blob|MEM_Str))==0 || pDest->z==sMem.z ); pDest->flags &= ~(MEM_Ephem|MEM_Static); pDest->flags |= MEM_Term; pDest->z = sMem.z; @@ -68961,7 +69635,6 @@ case OP_Affinity: { while( (cAff = *(zAffinity++))!=0 ){ assert( pIn1 <= &p->aMem[(p->nMem-p->nCursor)] ); assert( memIsValid(pIn1) ); - ExpandBlob(pIn1); applyAffinity(pIn1, cAff, encoding); pIn1++; } @@ -69039,8 +69712,9 @@ case OP_MakeRecord: { if( zAffinity ){ pRec = pData0; do{ - applyAffinity(pRec, *(zAffinity++), encoding); - }while( (++pRec)<=pLast ); + applyAffinity(pRec++, *(zAffinity++), encoding); + assert( zAffinity[0]==0 || pRec<=pLast ); + }while( zAffinity[0] ); } /* Loop through the elements that will make up the record to figure @@ -69107,7 +69781,7 @@ case OP_MakeRecord: { assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); pOut->n = (int)nByte; - pOut->flags = MEM_Blob | MEM_Dyn; + pOut->flags = MEM_Blob; pOut->xDel = 0; if( nZero ){ pOut->u.nZero = nZero; @@ -69384,25 +70058,19 @@ case OP_AutoCommit: { break; } -/* Opcode: Transaction P1 P2 * * * +/* Opcode: Transaction P1 P2 P3 P4 P5 ** -** Begin a transaction. The transaction ends when a Commit or Rollback -** opcode is encountered. Depending on the ON CONFLICT setting, the -** transaction might also be rolled back if an error is encountered. +** Begin a transaction on database P1 if a transaction is not already +** active. +** If P2 is non-zero, then a write-transaction is started, or if a +** read-transaction is already active, it is upgraded to a write-transaction. +** If P2 is zero, then a read-transaction is started. ** ** P1 is the index of the database file on which the transaction is ** started. Index 0 is the main database file and index 1 is the ** file used for temporary tables. Indices of 2 or more are used for ** attached databases. ** -** If P2 is non-zero, then a write-transaction is started. A RESERVED lock is -** obtained on the database file when a write-transaction is started. No -** other process can start another write transaction while this transaction is -** underway. Starting a write transaction also creates a rollback journal. A -** write transaction must be started before any changes can be made to the -** database. If P2 is greater than or equal to 2 then an EXCLUSIVE lock is -** also obtained on the file. -** ** If a write-transaction is started and the Vdbe.usesStmtJournal flag is ** true (this flag is set if the Vdbe may modify more than one row and may ** throw an ABORT exception), a statement transaction may also be opened. @@ -69413,10 +70081,21 @@ case OP_AutoCommit: { ** entire transaction. If no error is encountered, the statement transaction ** will automatically commit when the VDBE halts. ** -** If P2 is zero, then a read-lock is obtained on the database file. +** If P5!=0 then this opcode also checks the schema cookie against P3 +** and the schema generation counter against P4. +** The cookie changes its value whenever the database schema changes. +** This operation is used to detect when that the cookie has changed +** and that the current process needs to reread the schema. If the schema +** cookie in P3 differs from the schema cookie in the database header or +** if the schema generation counter in P4 differs from the current +** generation counter, then an SQLITE_SCHEMA error is raised and execution +** halts. The sqlite3_step() wrapper function might then reprepare the +** statement and rerun it from the beginning. */ case OP_Transaction: { Btree *pBt; + int iMeta; + int iGen; assert( p->bIsReader ); assert( p->readOnly==0 || pOp->p2==0 ); @@ -69460,6 +70139,35 @@ case OP_Transaction: { p->nStmtDefCons = db->nDeferredCons; p->nStmtDefImmCons = db->nDeferredImmCons; } + + /* Gather the schema version number for checking */ + sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); + iGen = db->aDb[pOp->p1].pSchema->iGeneration; + }else{ + iGen = iMeta = 0; + } + assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); + if( pOp->p5 && (iMeta!=pOp->p3 || iGen!=pOp->p4.i) ){ + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); + /* If the schema-cookie from the database file matches the cookie + ** stored with the in-memory representation of the schema, do + ** not reload the schema from the database file. + ** + ** If virtual-tables are in use, this is not just an optimization. + ** Often, v-tables store their data in other SQLite tables, which + ** are queried from within xNext() and other v-table methods using + ** prepared queries. If such a query is out-of-date, we do not want to + ** discard the database schema, as the user code implementing the + ** v-table would have to be ready for the sqlite3_vtab structure itself + ** to be invalidated whenever sqlite3_step() is called from within + ** a v-table method. + */ + if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ + sqlite3ResetOneSchema(db, pOp->p1); + } + p->expired = 1; + rc = SQLITE_SCHEMA; } break; } @@ -69534,66 +70242,6 @@ case OP_SetCookie: { /* in3 */ break; } -/* Opcode: VerifyCookie P1 P2 P3 * * -** -** Check the value of global database parameter number 0 (the -** schema version) and make sure it is equal to P2 and that the -** generation counter on the local schema parse equals P3. -** -** P1 is the database number which is 0 for the main database file -** and 1 for the file holding temporary tables and some higher number -** for auxiliary databases. -** -** The cookie changes its value whenever the database schema changes. -** This operation is used to detect when that the cookie has changed -** and that the current process needs to reread the schema. -** -** Either a transaction needs to have been started or an OP_Open needs -** to be executed (to establish a read lock) before this opcode is -** invoked. -*/ -case OP_VerifyCookie: { - int iMeta; - int iGen; - Btree *pBt; - - assert( pOp->p1>=0 && pOp->p1nDb ); - assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); - assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); - assert( p->bIsReader ); - pBt = db->aDb[pOp->p1].pBt; - if( pBt ){ - sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); - iGen = db->aDb[pOp->p1].pSchema->iGeneration; - }else{ - iGen = iMeta = 0; - } - if( iMeta!=pOp->p2 || iGen!=pOp->p3 ){ - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); - /* If the schema-cookie from the database file matches the cookie - ** stored with the in-memory representation of the schema, do - ** not reload the schema from the database file. - ** - ** If virtual-tables are in use, this is not just an optimization. - ** Often, v-tables store their data in other SQLite tables, which - ** are queried from within xNext() and other v-table methods using - ** prepared queries. If such a query is out-of-date, we do not want to - ** discard the database schema, as the user code implementing the - ** v-table would have to be ready for the sqlite3_vtab structure itself - ** to be invalidated whenever sqlite3_step() is called from within - ** a v-table method. - */ - if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ - sqlite3ResetOneSchema(db, pOp->p1); - } - - p->expired = 1; - rc = SQLITE_SCHEMA; - } - break; -} - /* Opcode: OpenRead P1 P2 P3 P4 P5 ** Synopsis: root=P2 iDb=P3 ** @@ -69807,7 +70455,7 @@ case OP_OpenEphemeral: { break; } -/* Opcode: SorterOpen P1 * * P4 * +/* Opcode: SorterOpen P1 P2 * P4 * ** ** This opcode works like OP_OpenEphemeral except that it opens ** a transient index that is specifically designed to sort large @@ -69827,14 +70475,13 @@ case OP_SorterOpen: { break; } -/* Opcode: OpenPseudo P1 P2 P3 * P5 -** Synopsis: content in r[P2@P3] +/* Opcode: OpenPseudo P1 P2 P3 * * +** Synopsis: P3 columns in r[P2] ** ** Open a new cursor that points to a fake table that contains a single -** row of data. The content of that one row in the content of memory -** register P2 when P5==0. In other words, cursor P1 becomes an alias for the -** MEM_Blob content contained in register P2. When P5==1, then the -** row is represented by P3 consecutive registers beginning with P2. +** row of data. The content of that one row is the content of memory +** register P2. In other words, cursor P1 becomes an alias for the +** MEM_Blob content contained in register P2. ** ** A pseudo-table created by this opcode is used to hold a single ** row output from the sorter so that the row can be decomposed into @@ -69854,7 +70501,7 @@ case OP_OpenPseudo: { pCx->nullRow = 1; pCx->pseudoTableReg = pOp->p2; pCx->isTable = 1; - pCx->multiPseudo = pOp->p5; + assert( pOp->p5==0 ); break; } @@ -69926,10 +70573,10 @@ case OP_Close: { ** ** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLt */ -case OP_SeekLt: /* jump, in3 */ -case OP_SeekLe: /* jump, in3 */ -case OP_SeekGe: /* jump, in3 */ -case OP_SeekGt: { /* jump, in3 */ +case OP_SeekLT: /* jump, in3 */ +case OP_SeekLE: /* jump, in3 */ +case OP_SeekGE: /* jump, in3 */ +case OP_SeekGT: { /* jump, in3 */ int res; int oc; VdbeCursor *pC; @@ -69942,9 +70589,9 @@ case OP_SeekGt: { /* jump, in3 */ pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->pseudoTableReg==0 ); - assert( OP_SeekLe == OP_SeekLt+1 ); - assert( OP_SeekGe == OP_SeekLt+2 ); - assert( OP_SeekGt == OP_SeekLt+3 ); + assert( OP_SeekLE == OP_SeekLT+1 ); + assert( OP_SeekGE == OP_SeekLT+2 ); + assert( OP_SeekGT == OP_SeekLT+3 ); assert( pC->isOrdered ); assert( pC->pCursor!=0 ); oc = pOp->opcode; @@ -69964,7 +70611,7 @@ case OP_SeekGt: { /* jump, in3 */ if( (pIn3->flags & MEM_Real)==0 ){ /* If the P3 value cannot be converted into any kind of a number, ** then the seek is not possible, so jump to P2 */ - pc = pOp->p2 - 1; + pc = pOp->p2 - 1; VdbeBranchTaken(1,2); break; } @@ -69976,19 +70623,19 @@ case OP_SeekGt: { /* jump, in3 */ ** (x <= 4.9) -> (x < 5) */ if( pIn3->r<(double)iKey ){ - assert( OP_SeekGe==(OP_SeekGt-1) ); - assert( OP_SeekLt==(OP_SeekLe-1) ); - assert( (OP_SeekLe & 0x0001)==(OP_SeekGt & 0x0001) ); - if( (oc & 0x0001)==(OP_SeekGt & 0x0001) ) oc--; + assert( OP_SeekGE==(OP_SeekGT-1) ); + assert( OP_SeekLT==(OP_SeekLE-1) ); + assert( (OP_SeekLE & 0x0001)==(OP_SeekGT & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekGT & 0x0001) ) oc--; } /* If the approximation iKey is smaller than the actual real search ** term, substitute <= for < and > for >=. */ else if( pIn3->r>(double)iKey ){ - assert( OP_SeekLe==(OP_SeekLt+1) ); - assert( OP_SeekGt==(OP_SeekGe+1) ); - assert( (OP_SeekLt & 0x0001)==(OP_SeekGe & 0x0001) ); - if( (oc & 0x0001)==(OP_SeekLt & 0x0001) ) oc++; + assert( OP_SeekLE==(OP_SeekLT+1) ); + assert( OP_SeekGT==(OP_SeekGE+1) ); + assert( (OP_SeekLT & 0x0001)==(OP_SeekGE & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++; } } rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)iKey, 0, &res); @@ -70007,17 +70654,17 @@ case OP_SeekGt: { /* jump, in3 */ r.nField = (u16)nField; /* The next line of code computes as follows, only faster: - ** if( oc==OP_SeekGt || oc==OP_SeekLe ){ - ** r.flags = UNPACKED_INCRKEY; + ** if( oc==OP_SeekGT || oc==OP_SeekLE ){ + ** r.default_rc = -1; ** }else{ - ** r.flags = 0; + ** r.default_rc = +1; ** } */ - r.flags = (u8)(UNPACKED_INCRKEY * (1 & (oc - OP_SeekLt))); - assert( oc!=OP_SeekGt || r.flags==UNPACKED_INCRKEY ); - assert( oc!=OP_SeekLe || r.flags==UNPACKED_INCRKEY ); - assert( oc!=OP_SeekGe || r.flags==0 ); - assert( oc!=OP_SeekLt || r.flags==0 ); + r.default_rc = ((1 & (oc - OP_SeekLT)) ? -1 : +1); + assert( oc!=OP_SeekGT || r.default_rc==-1 ); + assert( oc!=OP_SeekLE || r.default_rc==-1 ); + assert( oc!=OP_SeekGE || r.default_rc==+1 ); + assert( oc!=OP_SeekLT || r.default_rc==+1 ); r.aMem = &aMem[pOp->p3]; #ifdef SQLITE_DEBUG @@ -70035,8 +70682,9 @@ case OP_SeekGt: { /* jump, in3 */ #ifdef SQLITE_TEST sqlite3_search_count++; #endif - if( oc>=OP_SeekGe ){ assert( oc==OP_SeekGe || oc==OP_SeekGt ); - if( res<0 || (res==0 && oc==OP_SeekGt) ){ + if( oc>=OP_SeekGE ){ assert( oc==OP_SeekGE || oc==OP_SeekGT ); + if( res<0 || (res==0 && oc==OP_SeekGT) ){ + res = 0; rc = sqlite3BtreeNext(pC->pCursor, &res); if( rc!=SQLITE_OK ) goto abort_due_to_error; pC->rowidIsValid = 0; @@ -70044,8 +70692,9 @@ case OP_SeekGt: { /* jump, in3 */ res = 0; } }else{ - assert( oc==OP_SeekLt || oc==OP_SeekLe ); - if( res>0 || (res==0 && oc==OP_SeekLt) ){ + assert( oc==OP_SeekLT || oc==OP_SeekLE ); + if( res>0 || (res==0 && oc==OP_SeekLT) ){ + res = 0; rc = sqlite3BtreePrevious(pC->pCursor, &res); if( rc!=SQLITE_OK ) goto abort_due_to_error; pC->rowidIsValid = 0; @@ -70057,6 +70706,7 @@ case OP_SeekGt: { /* jump, in3 */ } } assert( pOp->p2>0 ); + VdbeBranchTaken(res!=0,2); if( res ){ pc = pOp->p2 - 1; } @@ -70165,16 +70815,13 @@ case OP_Found: { /* jump, in3 */ r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p4.i; r.aMem = pIn3; + for(ii=0; iip3+i, &r.aMem[i]); - } - } + if( ii ) REGISTER_TRACE(pOp->p3+ii, &r.aMem[ii]); #endif - r.flags = UNPACKED_PREFIX_MATCH; + } pIdxKey = &r; }else{ pIdxKey = sqlite3VdbeAllocUnpackedRecord( @@ -70184,15 +70831,15 @@ case OP_Found: { /* jump, in3 */ assert( pIn3->flags & MEM_Blob ); assert( (pIn3->flags & MEM_Zero)==0 ); /* zeroblobs already expanded */ sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey); - pIdxKey->flags |= UNPACKED_PREFIX_MATCH; } + pIdxKey->default_rc = 0; if( pOp->opcode==OP_NoConflict ){ /* For the OP_NoConflict opcode, take the jump if any of the ** input fields are NULL, since any key with a NULL will not ** conflict */ for(ii=0; iip2 - 1; + pc = pOp->p2 - 1; VdbeBranchTaken(1,2); break; } } @@ -70210,8 +70857,10 @@ case OP_Found: { /* jump, in3 */ pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; if( pOp->opcode==OP_Found ){ + VdbeBranchTaken(alreadyExists!=0,2); if( alreadyExists ) pc = pOp->p2 - 1; }else{ + VdbeBranchTaken(alreadyExists==0,2); if( !alreadyExists ) pc = pOp->p2 - 1; } break; @@ -70254,6 +70903,7 @@ case OP_NotExists: { /* jump, in3 */ pC->nullRow = 0; pC->cacheStatus = CACHE_STALE; pC->deferredMoveto = 0; + VdbeBranchTaken(res!=0,2); if( res!=0 ){ pc = pOp->p2 - 1; assert( pC->rowidIsValid==0 ); @@ -70335,59 +70985,54 @@ case OP_NewRowid: { /* out2-prerelease */ #endif if( !pC->useRandomRowid ){ - v = sqlite3BtreeGetCachedRowid(pC->pCursor); - if( v==0 ){ - rc = sqlite3BtreeLast(pC->pCursor, &res); - if( rc!=SQLITE_OK ){ - goto abort_due_to_error; - } - if( res ){ - v = 1; /* IMP: R-61914-48074 */ + rc = sqlite3BtreeLast(pC->pCursor, &res); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( res ){ + v = 1; /* IMP: R-61914-48074 */ + }else{ + assert( sqlite3BtreeCursorIsValid(pC->pCursor) ); + rc = sqlite3BtreeKeySize(pC->pCursor, &v); + assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */ + if( v>=MAX_ROWID ){ + pC->useRandomRowid = 1; }else{ - assert( sqlite3BtreeCursorIsValid(pC->pCursor) ); - rc = sqlite3BtreeKeySize(pC->pCursor, &v); - assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */ - if( v>=MAX_ROWID ){ - pC->useRandomRowid = 1; - }else{ - v++; /* IMP: R-29538-34987 */ - } + v++; /* IMP: R-29538-34987 */ } } + } #ifndef SQLITE_OMIT_AUTOINCREMENT - if( pOp->p3 ){ + if( pOp->p3 ){ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3>0 ); + if( p->pFrame ){ + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); /* Assert that P3 is a valid memory cell. */ - assert( pOp->p3>0 ); - if( p->pFrame ){ - for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); - /* Assert that P3 is a valid memory cell. */ - assert( pOp->p3<=pFrame->nMem ); - pMem = &pFrame->aMem[pOp->p3]; - }else{ - /* Assert that P3 is a valid memory cell. */ - assert( pOp->p3<=(p->nMem-p->nCursor) ); - pMem = &aMem[pOp->p3]; - memAboutToChange(p, pMem); - } - assert( memIsValid(pMem) ); - - REGISTER_TRACE(pOp->p3, pMem); - sqlite3VdbeMemIntegerify(pMem); - assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ - if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ - rc = SQLITE_FULL; /* IMP: R-12275-61338 */ - goto abort_due_to_error; - } - if( vu.i+1 ){ - v = pMem->u.i + 1; - } - pMem->u.i = v; + assert( pOp->p3<=pFrame->nMem ); + pMem = &pFrame->aMem[pOp->p3]; + }else{ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3<=(p->nMem-p->nCursor) ); + pMem = &aMem[pOp->p3]; + memAboutToChange(p, pMem); } -#endif + assert( memIsValid(pMem) ); - sqlite3BtreeSetCachedRowid(pC->pCursor, vp3, pMem); + sqlite3VdbeMemIntegerify(pMem); + assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ + if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ + rc = SQLITE_FULL; /* IMP: R-12275-61338 */ + goto abort_due_to_error; + } + if( vu.i+1 ){ + v = pMem->u.i + 1; + } + pMem->u.i = v; } +#endif if( pC->useRandomRowid ){ /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the ** largest possible integer (9223372036854775807) then the database @@ -70521,7 +71166,6 @@ case OP_InsertInt: { }else{ nZero = 0; } - sqlite3BtreeSetCachedRowid(pC->pCursor, 0); rc = sqlite3BtreeInsert(pC->pCursor, 0, iKey, pData->z, pData->n, nZero, (pOp->p5 & OPFLAG_APPEND)!=0, seekResult @@ -70583,7 +71227,6 @@ case OP_Delete: { rc = sqlite3VdbeCursorMoveto(pC); if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; - sqlite3BtreeSetCachedRowid(pC->pCursor, 0); rc = sqlite3BtreeDelete(pC->pCursor); pC->cacheStatus = CACHE_STALE; @@ -70635,6 +71278,7 @@ case OP_SorterCompare: { pIn3 = &aMem[pOp->p3]; nIgnore = pOp->p4.i; rc = sqlite3VdbeSorterCompare(pC, pIn3, nIgnore, &res); + VdbeBranchTaken(res!=0,2); if( res ){ pc = pOp->p2-1; } @@ -70672,7 +71316,7 @@ case OP_SorterData: { ** ** Write into register P2 the complete row key for cursor P1. ** There is no interpretation of the data. -** The key is copied onto the P3 register exactly as +** The key is copied onto the P2 register exactly as ** it is found in the database file. ** ** If the P1 cursor must be pointing to a valid row (not a NULL row) @@ -70834,8 +71478,9 @@ case OP_Last: { /* jump */ pC->deferredMoveto = 0; pC->rowidIsValid = 0; pC->cacheStatus = CACHE_STALE; - if( pOp->p2>0 && res ){ - pc = pOp->p2 - 1; + if( pOp->p2>0 ){ + VdbeBranchTaken(res!=0,2); + if( res ) pc = pOp->p2 - 1; } break; } @@ -70892,13 +71537,14 @@ case OP_Rewind: { /* jump */ } pC->nullRow = (u8)res; assert( pOp->p2>0 && pOp->p2nOp ); + VdbeBranchTaken(res!=0,2); if( res ){ pc = pOp->p2 - 1; } break; } -/* Opcode: Next P1 P2 * * P5 +/* Opcode: Next P1 P2 P3 P4 P5 ** ** Advance cursor P1 so that it points to the next key/data pair in its ** table or index. If there are no more key/value pairs then fall through @@ -70908,6 +71554,11 @@ case OP_Rewind: { /* jump */ ** The P1 cursor must be for a real table, not a pseudo-table. P1 must have ** been opened prior to this opcode or the program will segfault. ** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** ** P4 is always of type P4_ADVANCE. The function pointer points to ** sqlite3BtreeNext(). ** @@ -70916,12 +71567,12 @@ case OP_Rewind: { /* jump */ ** ** See also: Prev, NextIfOpen */ -/* Opcode: NextIfOpen P1 P2 * * P5 +/* Opcode: NextIfOpen P1 P2 P3 P4 P5 ** ** This opcode works just like OP_Next except that if cursor P1 is not ** open it behaves a no-op. */ -/* Opcode: Prev P1 P2 * * P5 +/* Opcode: Prev P1 P2 P3 P4 P5 ** ** Back up cursor P1 so that it points to the previous key/data pair in its ** table or index. If there is no previous key/value pairs then fall through @@ -70931,13 +71582,18 @@ case OP_Rewind: { /* jump */ ** The P1 cursor must be for a real table, not a pseudo-table. If P1 is ** not open then the behavior is undefined. ** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** ** P4 is always of type P4_ADVANCE. The function pointer points to ** sqlite3BtreePrevious(). ** ** If P5 is positive and the jump is taken, then event counter ** number P5-1 in the prepared statement is incremented. */ -/* Opcode: PrevIfOpen P1 P2 * * P5 +/* Opcode: PrevIfOpen P1 P2 P3 P4 P5 ** ** This opcode works just like OP_Prev except that if cursor P1 is not ** open it behaves a no-op. @@ -70959,9 +71615,12 @@ case OP_Next: /* jump */ assert( pOp->p1>=0 && pOp->p1nCursor ); assert( pOp->p5aCounter) ); pC = p->apCsr[pOp->p1]; + res = pOp->p3; assert( pC!=0 ); assert( pC->deferredMoveto==0 ); assert( pC->pCursor ); + assert( res==0 || (res==1 && pC->isTable==0) ); + testcase( res==1 ); assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); assert( pOp->opcode!=OP_NextIfOpen || pOp->p4.xAdvance==sqlite3BtreeNext ); @@ -70969,6 +71628,7 @@ case OP_Next: /* jump */ rc = pOp->p4.xAdvance(pC->pCursor, &res); next_tail: pC->cacheStatus = CACHE_STALE; + VdbeBranchTaken(res==0,2); if( res==0 ){ pC->nullRow = 0; pc = pOp->p2 - 1; @@ -70993,6 +71653,14 @@ next_tail: ** P3 is a flag that provides a hint to the b-tree layer that this ** insert is likely to be an append. ** +** If P5 has the OPFLAG_NCHANGE bit set, then the change counter is +** incremented by this instruction. If the OPFLAG_NCHANGE bit is clear, +** then the change counter is unchanged. +** +** If P5 has the OPFLAG_USESEEKRESULT bit set, then the cursor must have +** just done a seek to the spot where the new entry is to be inserted. +** This flag avoids doing an extra seek. +** ** This instruction only works for indices. The equivalent instruction ** for tables is OP_Insert. */ @@ -71053,7 +71721,7 @@ case OP_IdxDelete: { assert( pOp->p5==0 ); r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p3; - r.flags = UNPACKED_PREFIX_MATCH; + r.default_rc = 0; r.aMem = &aMem[pOp->p2]; #ifdef SQLITE_DEBUG { int i; for(i=0; ip4type==P4_INT32 ); r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p4.i; - if( pOp->p5 ){ - r.flags = UNPACKED_INCRKEY | UNPACKED_PREFIX_MATCH; + if( pOp->opcodeopcode==OP_IdxLE || pOp->opcode==OP_IdxGT ); + r.default_rc = -1; }else{ - r.flags = UNPACKED_PREFIX_MATCH; + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxLT ); + r.default_rc = 0; } r.aMem = &aMem[pOp->p3]; #ifdef SQLITE_DEBUG @@ -71158,12 +71846,15 @@ case OP_IdxGE: { /* jump */ #endif res = 0; /* Not needed. Only used to silence a warning. */ rc = sqlite3VdbeIdxKeyCompare(pC, &r, &res); - if( pOp->opcode==OP_IdxLT ){ + assert( (OP_IdxLE&1)==(OP_IdxLT&1) && (OP_IdxGE&1)==(OP_IdxGT&1) ); + if( (pOp->opcode&1)==(OP_IdxLT&1) ){ + assert( pOp->opcode==OP_IdxLE || pOp->opcode==OP_IdxLT ); res = -res; }else{ - assert( pOp->opcode==OP_IdxGE ); + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxGT ); res++; } + VdbeBranchTaken(res>0,2); if( res>0 ){ pc = pOp->p2 - 1 ; } @@ -71256,7 +71947,6 @@ case OP_Clear: { nChange = 0; assert( p->readOnly==0 ); - assert( pOp->p1!=1 ); assert( (p->btreeMask & (((yDbMask)1)<p2))!=0 ); rc = sqlite3BtreeClearTable( db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &nChange : 0) @@ -71525,9 +72215,11 @@ case OP_RowSetRead: { /* jump, in1, out3 */ /* The boolean index is empty */ sqlite3VdbeMemSetNull(pIn1); pc = pOp->p2 - 1; + VdbeBranchTaken(1,2); }else{ /* A value was pulled from the index */ sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val); + VdbeBranchTaken(0,2); } goto check_for_interrupt; } @@ -71579,6 +72271,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */ exists = sqlite3RowSetTest(pIn1->u.pRowSet, (u8)(iSet>=0 ? iSet & 0xf : 0xff), pIn3->u.i); + VdbeBranchTaken(exists!=0,2); if( exists ){ pc = pOp->p2 - 1; break; @@ -71593,7 +72286,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */ #ifndef SQLITE_OMIT_TRIGGER -/* Opcode: Program P1 P2 P3 P4 * +/* Opcode: Program P1 P2 P3 P4 P5 ** ** Execute the trigger program passed as P4 (type P4_SUBPROGRAM). ** @@ -71605,6 +72298,8 @@ case OP_RowSetTest: { /* jump, in1, in3 */ ** memory required by the sub-vdbe at runtime. ** ** P4 is a pointer to the VM containing the trigger program. +** +** If P5 is non-zero, then recursive program invocation is enabled. */ case OP_Program: { /* jump */ int nMem; /* Number of memory registers for sub-program */ @@ -71682,7 +72377,7 @@ case OP_Program: { /* jump */ pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem]; for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){ - pMem->flags = MEM_Invalid; + pMem->flags = MEM_Undefined; pMem->db = db; } }else{ @@ -71769,8 +72464,10 @@ case OP_FkCounter: { */ case OP_FkIfZero: { /* jump */ if( pOp->p1 ){ + VdbeBranchTaken(db->nDeferredCons==0 && db->nDeferredImmCons==0, 2); if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) pc = pOp->p2-1; }else{ + VdbeBranchTaken(p->nFkConstraint==0 && db->nDeferredImmCons==0, 2); if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) pc = pOp->p2-1; } break; @@ -71819,6 +72516,7 @@ case OP_MemMax: { /* in2 */ case OP_IfPos: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken( pIn1->u.i>0, 2); if( pIn1->u.i>0 ){ pc = pOp->p2 - 1; } @@ -71836,6 +72534,7 @@ case OP_IfPos: { /* jump, in1 */ case OP_IfNeg: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken(pIn1->u.i<0, 2); if( pIn1->u.i<0 ){ pc = pOp->p2 - 1; } @@ -71855,6 +72554,7 @@ case OP_IfZero: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); pIn1->u.i += pOp->p3; + VdbeBranchTaken(pIn1->u.i==0, 2); if( pIn1->u.i==0 ){ pc = pOp->p2 - 1; } @@ -71889,7 +72589,6 @@ case OP_AggStep: { assert( memIsValid(pRec) ); apVal[i] = pRec; memAboutToChange(p, pRec); - sqlite3VdbeMemStoreType(pRec); } ctx.pFunc = pOp->p4.pFunc; assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); @@ -71992,7 +72691,7 @@ case OP_Checkpoint: { #endif #ifndef SQLITE_OMIT_PRAGMA -/* Opcode: JournalMode P1 P2 P3 * P5 +/* Opcode: JournalMode P1 P2 P3 * * ** ** Change the journal mode of database P1 to P3. P3 must be one of the ** PAGER_JOURNALMODE_XXX values. If changing between the various rollback @@ -72126,6 +72825,7 @@ case OP_IncrVacuum: { /* jump */ assert( p->readOnly==0 ); pBt = db->aDb[pOp->p1].pBt; rc = sqlite3BtreeIncrVacuum(pBt); + VdbeBranchTaken(rc==SQLITE_DONE,2); if( rc==SQLITE_DONE ){ pc = pOp->p2 - 1; rc = SQLITE_OK; @@ -72322,7 +73022,6 @@ case OP_VFilter: { /* jump */ apArg = p->apArg; for(i = 0; iinVtabMethod = 1; @@ -72332,7 +73031,7 @@ case OP_VFilter: { /* jump */ if( rc==SQLITE_OK ){ res = pModule->xEof(pVtabCursor); } - + VdbeBranchTaken(res!=0,2); if( res ){ pc = pOp->p2 - 1; } @@ -72437,7 +73136,7 @@ case OP_VNext: { /* jump */ if( rc==SQLITE_OK ){ res = pModule->xEof(pCur->pVtabCursor); } - + VdbeBranchTaken(!res,2); if( !res ){ /* If there is data, jump to P2 */ pc = pOp->p2 - 1; @@ -72478,7 +73177,7 @@ case OP_VRename: { #endif #ifndef SQLITE_OMIT_VIRTUALTABLE -/* Opcode: VUpdate P1 P2 P3 P4 * +/* Opcode: VUpdate P1 P2 P3 P4 P5 ** Synopsis: data=r[P3@P2] ** ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. @@ -72501,6 +73200,9 @@ case OP_VRename: { ** P1 is a boolean flag. If it is set to true and the xUpdate call ** is successful, then the value returned by sqlite3_last_insert_rowid() ** is set to the value of the rowid for the row just inserted. +** +** P5 is the error actions (OE_Replace, OE_Fail, OE_Ignore, etc) to +** apply in the case of a constraint failure on an insert or update. */ case OP_VUpdate: { sqlite3_vtab *pVtab; @@ -72526,7 +73228,6 @@ case OP_VUpdate: { for(i=0; ip2 ){ + pc = pOp->p2 - 1; + } +#ifndef SQLITE_OMIT_TRACE if( db->xTrace && !p->doingRerun && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 @@ -72624,9 +73335,9 @@ case OP_Trace: { sqlite3DebugPrintf("SQL-trace: %s\n", zTrace); } #endif /* SQLITE_DEBUG */ +#endif /* SQLITE_OMIT_TRACE */ break; } -#endif /* Opcode: Noop * * * * * @@ -72658,10 +73369,6 @@ default: { /* This is really OP_Noop and OP_Explain */ u64 elapsed = sqlite3Hwtime() - start; pOp->cycles += elapsed; pOp->cnt++; -#if 0 - fprintf(stdout, "%10llu ", elapsed); - sqlite3VdbePrintOp(stdout, origPc, &aOp[origPc]); -#endif } #endif @@ -72887,22 +73594,20 @@ SQLITE_API int sqlite3_blob_open( ** which closes the b-tree cursor and (possibly) commits the ** transaction. */ + static const int iLn = VDBE_OFFSET_LINENO(4); static const VdbeOpList openBlob[] = { - {OP_Transaction, 0, 0, 0}, /* 0: Start a transaction */ - {OP_VerifyCookie, 0, 0, 0}, /* 1: Check the schema cookie */ - {OP_TableLock, 0, 0, 0}, /* 2: Acquire a read or write lock */ - + /* {OP_Transaction, 0, 0, 0}, // 0: Inserted separately */ + {OP_TableLock, 0, 0, 0}, /* 1: Acquire a read or write lock */ /* One of the following two instructions is replaced by an OP_Noop. */ - {OP_OpenRead, 0, 0, 0}, /* 3: Open cursor 0 for reading */ - {OP_OpenWrite, 0, 0, 0}, /* 4: Open cursor 0 for read/write */ - - {OP_Variable, 1, 1, 1}, /* 5: Push the rowid to the stack */ - {OP_NotExists, 0, 10, 1}, /* 6: Seek the cursor */ - {OP_Column, 0, 0, 1}, /* 7 */ - {OP_ResultRow, 1, 0, 0}, /* 8 */ - {OP_Goto, 0, 5, 0}, /* 9 */ - {OP_Close, 0, 0, 0}, /* 10 */ - {OP_Halt, 0, 0, 0}, /* 11 */ + {OP_OpenRead, 0, 0, 0}, /* 2: Open cursor 0 for reading */ + {OP_OpenWrite, 0, 0, 0}, /* 3: Open cursor 0 for read/write */ + {OP_Variable, 1, 1, 1}, /* 4: Push the rowid to the stack */ + {OP_NotExists, 0, 10, 1}, /* 5: Seek the cursor */ + {OP_Column, 0, 0, 1}, /* 6 */ + {OP_ResultRow, 1, 0, 0}, /* 7 */ + {OP_Goto, 0, 4, 0}, /* 8 */ + {OP_Close, 0, 0, 0}, /* 9 */ + {OP_Halt, 0, 0, 0}, /* 10 */ }; int rc = SQLITE_OK; @@ -73015,36 +73720,31 @@ SQLITE_API int sqlite3_blob_open( Vdbe *v = (Vdbe *)pBlob->pStmt; int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - sqlite3VdbeAddOpList(v, sizeof(openBlob)/sizeof(VdbeOpList), openBlob); - - /* Configure the OP_Transaction */ - sqlite3VdbeChangeP1(v, 0, iDb); - sqlite3VdbeChangeP2(v, 0, flags); - - /* Configure the OP_VerifyCookie */ - sqlite3VdbeChangeP1(v, 1, iDb); - sqlite3VdbeChangeP2(v, 1, pTab->pSchema->schema_cookie); - sqlite3VdbeChangeP3(v, 1, pTab->pSchema->iGeneration); + sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, flags, + pTab->pSchema->schema_cookie, + pTab->pSchema->iGeneration); + sqlite3VdbeChangeP5(v, 1); + sqlite3VdbeAddOpList(v, ArraySize(openBlob), openBlob, iLn); /* Make sure a mutex is held on the table to be accessed */ sqlite3VdbeUsesBtree(v, iDb); /* Configure the OP_TableLock instruction */ #ifdef SQLITE_OMIT_SHARED_CACHE - sqlite3VdbeChangeToNoop(v, 2); + sqlite3VdbeChangeToNoop(v, 1); #else - sqlite3VdbeChangeP1(v, 2, iDb); - sqlite3VdbeChangeP2(v, 2, pTab->tnum); - sqlite3VdbeChangeP3(v, 2, flags); - sqlite3VdbeChangeP4(v, 2, pTab->zName, P4_TRANSIENT); + sqlite3VdbeChangeP1(v, 1, iDb); + sqlite3VdbeChangeP2(v, 1, pTab->tnum); + sqlite3VdbeChangeP3(v, 1, flags); + sqlite3VdbeChangeP4(v, 1, pTab->zName, P4_TRANSIENT); #endif /* Remove either the OP_OpenWrite or OpenRead. Set the P2 ** parameter of the other to pTab->tnum. */ - sqlite3VdbeChangeToNoop(v, 4 - flags); - sqlite3VdbeChangeP2(v, 3 + flags, pTab->tnum); - sqlite3VdbeChangeP3(v, 3 + flags, iDb); + sqlite3VdbeChangeToNoop(v, 3 - flags); + sqlite3VdbeChangeP2(v, 2 + flags, pTab->tnum); + sqlite3VdbeChangeP3(v, 2 + flags, iDb); /* Configure the number of columns. Configure the cursor to ** think that the table has one more column than it really @@ -73053,8 +73753,8 @@ SQLITE_API int sqlite3_blob_open( ** we can invoke OP_Column to fill in the vdbe cursors type ** and offset cache without causing any IO. */ - sqlite3VdbeChangeP4(v, 3+flags, SQLITE_INT_TO_PTR(pTab->nCol+1),P4_INT32); - sqlite3VdbeChangeP2(v, 7, pTab->nCol); + sqlite3VdbeChangeP4(v, 2+flags, SQLITE_INT_TO_PTR(pTab->nCol+1),P4_INT32); + sqlite3VdbeChangeP2(v, 6, pTab->nCol); if( !db->mallocFailed ){ pParse->nVar = 1; pParse->nMem = 1; @@ -73639,10 +74339,10 @@ static void vdbeSorterCompare( return; } } - r2->flags |= UNPACKED_PREFIX_MATCH; + assert( r2->default_rc==0 ); } - *pRes = sqlite3VdbeRecordCompare(nKey1, pKey1, r2); + *pRes = sqlite3VdbeRecordCompare(nKey1, pKey1, r2, 0); } /* @@ -75279,6 +75979,8 @@ static int lookupName( }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ pExpr->iTable = 0; pTab = pParse->pTriggerTab; + }else{ + pTab = 0; } if( pTab ){ @@ -75322,8 +76024,8 @@ static int lookupName( /* ** Perhaps the name is a reference to the ROWID */ - assert( pTab!=0 || cntTab==0 ); - if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) && HasRowid(pTab) ){ + if( cnt==0 && cntTab==1 && pMatch && sqlite3IsRowid(zCol) + && HasRowid(pMatch->pTab) ){ cnt = 1; pExpr->iColumn = -1; /* IMP: R-44911-55124 */ pExpr->affinity = SQLITE_AFF_INTEGER; @@ -77454,7 +78156,6 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ pNew->iLimit = 0; pNew->iOffset = 0; pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; - pNew->pRightmost = 0; pNew->addrOpenEphm[0] = -1; pNew->addrOpenEphm[1] = -1; pNew->addrOpenEphm[2] = -1; @@ -77764,24 +78465,6 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ } } -/* -** Generate an OP_IsNull instruction that tests register iReg and jumps -** to location iDest if the value in iReg is NULL. The value in iReg -** was computed by pExpr. If we can look at pExpr at compile-time and -** determine that it can never generate a NULL, then the OP_IsNull operation -** can be omitted. -*/ -SQLITE_PRIVATE void sqlite3ExprCodeIsNullJump( - Vdbe *v, /* The VDBE under construction */ - const Expr *pExpr, /* Only generate OP_IsNull if this expr can be NULL */ - int iReg, /* Test the value in this register for NULL */ - int iDest /* Jump here if the value is null */ -){ - if( sqlite3ExprCanBeNull(pExpr) ){ - sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iDest); - } -} - /* ** Return TRUE if the given expression is a constant which would be ** unchanged by OP_Affinity with the affinity given in the second @@ -77978,7 +78661,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){ pExpr = p->pEList->a[0].pExpr; iCol = (i16)pExpr->iColumn; - /* Code an OP_VerifyCookie and OP_TableLock for . */ + /* Code an OP_Transaction and OP_TableLock for
    . */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); sqlite3CodeVerifySchema(pParse, iDb); sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); @@ -77989,9 +78672,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){ */ assert(v); if( iCol<0 ){ - int iAddr; - - iAddr = sqlite3CodeOnce(pParse); + int iAddr = sqlite3CodeOnce(pParse); + VdbeCoverage(v); sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); eType = IN_INDEX_ROWID; @@ -78016,18 +78698,18 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){ && sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], 0)==pReq && (!mustBeUnique || (pIdx->nKeyCol==1 && pIdx->onError!=OE_None)) ){ - int iAddr = sqlite3CodeOnce(pParse); + int iAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); VdbeComment((v, "%s", pIdx->zName)); assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 ); eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; - sqlite3VdbeJumpHere(v, iAddr); if( prNotFound && !pTab->aCol[iCol].notNull ){ *prNotFound = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Null, 0, *prNotFound); } + sqlite3VdbeJumpHere(v, iAddr); } } } @@ -78116,7 +78798,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( ** save the results, and reuse the same result on subsequent invocations. */ if( !ExprHasProperty(pExpr, EP_VarSelect) ){ - testAddr = sqlite3CodeOnce(pParse); + testAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); } #ifndef SQLITE_OMIT_EXPLAIN @@ -78157,7 +78839,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( */ pExpr->iTable = pParse->nTab++; addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, !isRowid); - if( rMayHaveNull==0 ) sqlite3VdbeChangeP5(v, BTREE_UNORDERED); pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, 1, 1); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ @@ -78233,6 +78914,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( if( isRowid ){ sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); }else{ sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); @@ -78356,10 +79038,11 @@ static void sqlite3ExprCodeIN( if( destIfNull==destIfFalse ){ /* Shortcut for the common case where the false and NULL outcomes are ** the same. */ - sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); + sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); VdbeCoverage(v); }else{ - int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); + int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); sqlite3VdbeJumpHere(v, addr1); } @@ -78367,8 +79050,9 @@ static void sqlite3ExprCodeIN( if( eType==IN_INDEX_ROWID ){ /* In this case, the RHS is the ROWID of table b-tree */ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse); + sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1); + VdbeCoverage(v); }else{ /* In this case, the RHS is an index b-tree. */ @@ -78389,19 +79073,20 @@ static void sqlite3ExprCodeIN( ** for this particular IN operator. */ sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1); - + VdbeCoverage(v); }else{ /* In this branch, the RHS of the IN might contain a NULL and ** the presence of a NULL on the RHS makes a difference in the ** outcome. */ - int j1, j2, j3; + int j1, j2; /* First check to see if the LHS is contained in the RHS. If so, ** then the presence of NULLs in the RHS does not matter, so jump ** over all of the code that follows. */ j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); + VdbeCoverage(v); /* Here we begin generating code that runs if the LHS is not ** contained within the RHS. Generate additional code that @@ -78409,18 +79094,15 @@ static void sqlite3ExprCodeIN( ** jump to destIfNull. If there are no NULLs in the RHS then ** jump to destIfFalse. */ - j2 = sqlite3VdbeAddOp1(v, OP_NotNull, rRhsHasNull); - j3 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, rRhsHasNull, 1); - sqlite3VdbeAddOp2(v, OP_Integer, -1, rRhsHasNull); - sqlite3VdbeJumpHere(v, j3); - sqlite3VdbeAddOp2(v, OP_AddImm, rRhsHasNull, 1); - sqlite3VdbeJumpHere(v, j2); - - /* Jump to the appropriate target depending on whether or not - ** the RHS contains a NULL - */ - sqlite3VdbeAddOp2(v, OP_If, rRhsHasNull, destIfNull); + sqlite3VdbeAddOp2(v, OP_If, rRhsHasNull, destIfNull); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_IfNot, rRhsHasNull, destIfFalse); VdbeCoverage(v); + j2 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, rRhsHasNull, 1); + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Integer, 0, rRhsHasNull); sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); + sqlite3VdbeJumpHere(v, j2); + sqlite3VdbeAddOp2(v, OP_Integer, 1, rRhsHasNull); + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); /* The OP_Found at the top of this branch jumps here when true, ** causing the overall IN expression evaluation to fall through. @@ -78941,22 +79623,16 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_GE: case TK_NE: case TK_EQ: { - assert( TK_LT==OP_Lt ); - assert( TK_LE==OP_Le ); - assert( TK_GT==OP_Gt ); - assert( TK_GE==OP_Ge ); - assert( TK_EQ==OP_Eq ); - assert( TK_NE==OP_Ne ); - testcase( op==TK_LT ); - testcase( op==TK_LE ); - testcase( op==TK_GT ); - testcase( op==TK_GE ); - testcase( op==TK_EQ ); - testcase( op==TK_NE ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, inReg, SQLITE_STOREP2); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); testcase( regFree1==0 ); testcase( regFree2==0 ); break; @@ -78970,6 +79646,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) op = (op==TK_IS) ? TK_EQ : TK_NE; codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, inReg, SQLITE_STOREP2 | SQLITE_NULLEQ); + VdbeCoverageIf(v, op==TK_EQ); + VdbeCoverageIf(v, op==TK_NE); testcase( regFree1==0 ); testcase( regFree2==0 ); break; @@ -78986,28 +79664,17 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_LSHIFT: case TK_RSHIFT: case TK_CONCAT: { - assert( TK_AND==OP_And ); - assert( TK_OR==OP_Or ); - assert( TK_PLUS==OP_Add ); - assert( TK_MINUS==OP_Subtract ); - assert( TK_REM==OP_Remainder ); - assert( TK_BITAND==OP_BitAnd ); - assert( TK_BITOR==OP_BitOr ); - assert( TK_SLASH==OP_Divide ); - assert( TK_LSHIFT==OP_ShiftLeft ); - assert( TK_RSHIFT==OP_ShiftRight ); - assert( TK_CONCAT==OP_Concat ); - testcase( op==TK_AND ); - testcase( op==TK_OR ); - testcase( op==TK_PLUS ); - testcase( op==TK_MINUS ); - testcase( op==TK_REM ); - testcase( op==TK_BITAND ); - testcase( op==TK_BITOR ); - testcase( op==TK_SLASH ); - testcase( op==TK_LSHIFT ); - testcase( op==TK_RSHIFT ); - testcase( op==TK_CONCAT ); + assert( TK_AND==OP_And ); testcase( op==TK_AND ); + assert( TK_OR==OP_Or ); testcase( op==TK_OR ); + assert( TK_PLUS==OP_Add ); testcase( op==TK_PLUS ); + assert( TK_MINUS==OP_Subtract ); testcase( op==TK_MINUS ); + assert( TK_REM==OP_Remainder ); testcase( op==TK_REM ); + assert( TK_BITAND==OP_BitAnd ); testcase( op==TK_BITAND ); + assert( TK_BITOR==OP_BitOr ); testcase( op==TK_BITOR ); + assert( TK_SLASH==OP_Divide ); testcase( op==TK_SLASH ); + assert( TK_LSHIFT==OP_ShiftLeft ); testcase( op==TK_LSHIFT ); + assert( TK_RSHIFT==OP_ShiftRight ); testcase( op==TK_RSHIFT ); + assert( TK_CONCAT==OP_Concat ); testcase( op==TK_CONCAT ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); sqlite3VdbeAddOp3(v, op, r2, r1, target); @@ -79039,10 +79706,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } case TK_BITNOT: case TK_NOT: { - assert( TK_BITNOT==OP_BitNot ); - assert( TK_NOT==OP_Not ); - testcase( op==TK_BITNOT ); - testcase( op==TK_NOT ); + assert( TK_BITNOT==OP_BitNot ); testcase( op==TK_BITNOT ); + assert( TK_NOT==OP_Not ); testcase( op==TK_NOT ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); testcase( regFree1==0 ); inReg = target; @@ -79052,14 +79717,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_ISNULL: case TK_NOTNULL: { int addr; - assert( TK_ISNULL==OP_IsNull ); - assert( TK_NOTNULL==OP_NotNull ); - testcase( op==TK_ISNULL ); - testcase( op==TK_NOTNULL ); + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); sqlite3VdbeAddOp2(v, OP_Integer, 1, target); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); testcase( regFree1==0 ); addr = sqlite3VdbeAddOp1(v, op, r1); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); sqlite3VdbeAddOp2(v, OP_AddImm, target, -1); sqlite3VdbeJumpHere(v, addr); break; @@ -79111,6 +79776,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); for(i=1; ia[i].pExpr, target); @@ -79248,13 +79914,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) r3 = sqlite3GetTempReg(pParse); r4 = sqlite3GetTempReg(pParse); codeCompare(pParse, pLeft, pRight, OP_Ge, - r1, r2, r3, SQLITE_STOREP2); + r1, r2, r3, SQLITE_STOREP2); VdbeCoverage(v); pLItem++; pRight = pLItem->pExpr; sqlite3ReleaseTempReg(pParse, regFree2); r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2); testcase( regFree2==0 ); codeCompare(pParse, pLeft, pRight, OP_Le, r1, r2, r4, SQLITE_STOREP2); + VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_And, r3, r4, target); sqlite3ReleaseTempReg(pParse, r3); sqlite3ReleaseTempReg(pParse, r4); @@ -79421,6 +80088,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( pExpr->affinity==OE_Ignore ){ sqlite3VdbeAddOp4( v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); + VdbeCoverage(v); }else{ sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_TRIGGER, pExpr->affinity, pExpr->u.zToken, 0, 0); @@ -79508,7 +80176,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ ** results in register target. The results are guaranteed to appear ** in register target. */ -SQLITE_PRIVATE int sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ +SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ int inReg; assert( target>0 && target<=pParse->nMem ); @@ -79521,7 +80189,20 @@ SQLITE_PRIVATE int sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); } } - return target; +} + +/* +** Generate code that will evaluate expression pExpr and store the +** results in register target. The results are guaranteed to appear +** in register target. If the expression is constant, then this routine +** might choose to code the expression at initialization time. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ + if( pParse->okConstFactor && sqlite3ExprIsConstant(pExpr) ){ + sqlite3ExprCodeAtInit(pParse, pExpr, target, 0); + }else{ + sqlite3ExprCode(pParse, pExpr, target); + } } /* @@ -79536,25 +80217,16 @@ SQLITE_PRIVATE int sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ ** times. They are evaluated once and the results of the expression ** are reused. */ -SQLITE_PRIVATE int sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){ +SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){ Vdbe *v = pParse->pVdbe; - int inReg; - inReg = sqlite3ExprCode(pParse, pExpr, target); + int iMem; + assert( target>0 ); - /* The only place, other than this routine, where expressions can be - ** converted to TK_REGISTER is internal subexpressions in BETWEEN and - ** CASE operators. Neither ever calls this routine. And this routine - ** is never called twice on the same expression. Hence it is impossible - ** for the input to this routine to already be a register. Nevertheless, - ** it seems prudent to keep the ALWAYS() in case the conditions above - ** change with future modifications or enhancements. */ - if( ALWAYS(pExpr->op!=TK_REGISTER) ){ - int iMem; - iMem = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Copy, inReg, iMem); - exprToRegister(pExpr, iMem); - } - return inReg; + assert( pExpr->op!=TK_REGISTER ); + sqlite3ExprCode(pParse, pExpr, target); + iMem = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Copy, target, iMem); + exprToRegister(pExpr, iMem); } #if defined(SQLITE_ENABLE_TREE_EXPLAIN) @@ -79989,23 +80661,17 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int case TK_GE: case TK_NE: case TK_EQ: { - assert( TK_LT==OP_Lt ); - assert( TK_LE==OP_Le ); - assert( TK_GT==OP_Gt ); - assert( TK_GE==OP_Ge ); - assert( TK_EQ==OP_Eq ); - assert( TK_NE==OP_Ne ); - testcase( op==TK_LT ); - testcase( op==TK_LE ); - testcase( op==TK_GT ); - testcase( op==TK_GE ); - testcase( op==TK_EQ ); - testcase( op==TK_NE ); testcase( jumpIfNull==0 ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, jumpIfNull); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); testcase( regFree1==0 ); testcase( regFree2==0 ); break; @@ -80019,18 +80685,20 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int op = (op==TK_IS) ? TK_EQ : TK_NE; codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, SQLITE_NULLEQ); + VdbeCoverageIf(v, op==TK_EQ); + VdbeCoverageIf(v, op==TK_NE); testcase( regFree1==0 ); testcase( regFree2==0 ); break; } case TK_ISNULL: case TK_NOTNULL: { - assert( TK_ISNULL==OP_IsNull ); - assert( TK_NOTNULL==OP_NotNull ); - testcase( op==TK_ISNULL ); - testcase( op==TK_NOTNULL ); + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); sqlite3VdbeAddOp2(v, op, r1, dest); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); testcase( regFree1==0 ); break; } @@ -80057,6 +80725,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int }else{ r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); testcase( regFree1==0 ); testcase( jumpIfNull==0 ); } @@ -80148,17 +80817,17 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int case TK_GE: case TK_NE: case TK_EQ: { - testcase( op==TK_LT ); - testcase( op==TK_LE ); - testcase( op==TK_GT ); - testcase( op==TK_GE ); - testcase( op==TK_EQ ); - testcase( op==TK_NE ); testcase( jumpIfNull==0 ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, jumpIfNull); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); testcase( regFree1==0 ); testcase( regFree2==0 ); break; @@ -80172,16 +80841,18 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, SQLITE_NULLEQ); + VdbeCoverageIf(v, op==TK_EQ); + VdbeCoverageIf(v, op==TK_NE); testcase( regFree1==0 ); testcase( regFree2==0 ); break; } case TK_ISNULL: case TK_NOTNULL: { - testcase( op==TK_ISNULL ); - testcase( op==TK_NOTNULL ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); sqlite3VdbeAddOp2(v, op, r1, dest); + testcase( op==TK_ISNULL ); VdbeCoverageIf(v, op==TK_ISNULL); + testcase( op==TK_NOTNULL ); VdbeCoverageIf(v, op==TK_NOTNULL); testcase( regFree1==0 ); break; } @@ -80210,6 +80881,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int }else{ r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); testcase( regFree1==0 ); testcase( jumpIfNull==0 ); } @@ -80756,8 +81428,8 @@ static void renameTableFunc( assert( len>0 ); } while( token!=TK_LP && token!=TK_USING ); - zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", ((u8*)tname.z) - zSql, zSql, - zTableName, tname.z+tname.n); + zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql), + zSql, zTableName, tname.z+tname.n); sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC); } } @@ -80809,7 +81481,7 @@ static void renameParentFunc( sqlite3Dequote(zParent); if( 0==sqlite3StrICmp((const char *)zOld, zParent) ){ char *zOut = sqlite3MPrintf(db, "%s%.*s\"%w\"", - (zOutput?zOutput:""), z-zInput, zInput, (const char *)zNew + (zOutput?zOutput:""), (int)(z-zInput), zInput, (const char *)zNew ); sqlite3DbFree(db, zOutput); zOutput = zOut; @@ -80895,8 +81567,8 @@ static void renameTriggerFunc( /* Variable tname now contains the token that is the old table-name ** in the CREATE TRIGGER statement. */ - zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", ((u8*)tname.z) - zSql, zSql, - zTableName, tname.z+tname.n); + zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql), + zSql, zTableName, tname.z+tname.n); sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC); } } @@ -81148,7 +81820,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( } #endif - /* Begin a transaction and code the VerifyCookie for database iDb. + /* Begin a transaction for database iDb. ** Then modify the schema cookie (since the ALTER TABLE modifies the ** schema). Open a statement transaction if the table is a virtual ** table. @@ -81284,6 +81956,7 @@ SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minForm sqlite3VdbeUsesBtree(v, iDb); sqlite3VdbeAddOp2(v, OP_Integer, minFormat, r2); j1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, r2); sqlite3VdbeJumpHere(v, j1); sqlite3ReleaseTempReg(pParse, r1); @@ -82584,6 +83257,7 @@ static void analyzeOneTable( ** */ addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); addrGotoChng0 = sqlite3VdbeAddOp0(v, OP_Goto); @@ -82605,6 +83279,7 @@ static void analyzeOneTable( aGotoChng[i] = sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_Integer, nCol, regChng); aGotoChng[nCol] = sqlite3VdbeAddOp0(v, OP_Goto); @@ -82651,7 +83326,7 @@ static void analyzeOneTable( sqlite3VdbeAddOp3(v, OP_Function, 1, regStat4, regTemp); sqlite3VdbeChangeP4(v, -1, (char*)&statPushFuncdef, P4_FUNCDEF); sqlite3VdbeChangeP5(v, 2+IsStat34); - sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); /* Add the entry to the stat1 table. */ callStatGet(v, regStat4, STAT_GET_STAT1, regStat1); @@ -82678,10 +83353,15 @@ static void analyzeOneTable( addrNext = sqlite3VdbeCurrentAddr(v); callStatGet(v, regStat4, STAT_GET_ROWID, regSampleRowid); addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); + VdbeCoverage(v); callStatGet(v, regStat4, STAT_GET_NEQ, regEq); callStatGet(v, regStat4, STAT_GET_NLT, regLt); callStatGet(v, regStat4, STAT_GET_NDLT, regDLt); sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); + /* We know that the regSampleRowid row exists because it was read by + ** the previous loop. Thus the not-found jump of seekOp will never + ** be taken */ + VdbeCoverageNeverTaken(v); #ifdef SQLITE_ENABLE_STAT3 sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, pIdx->aiColumn[0], regSample); @@ -82692,10 +83372,10 @@ static void analyzeOneTable( } sqlite3VdbeAddOp3(v, OP_MakeRecord, regCol, nCol+1, regSample); #endif - sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 6, regTemp, "bbbbbb", 0); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regTabname, 6, regTemp); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regNewRowid); sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regTemp, regNewRowid); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNext); + sqlite3VdbeAddOp2(v, OP_Goto, 1, addrNext); /* P1==1 for end-of-loop */ sqlite3VdbeJumpHere(v, addrIsNull); } #endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ @@ -82712,7 +83392,7 @@ static void analyzeOneTable( if( pOnlyIdx==0 && needTableCnt ){ VdbeComment((v, "%s", pTab->zName)); sqlite3VdbeAddOp2(v, OP_Count, iTabCur, regStat1); - jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1); + jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Null, 0, regIdxname); sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "aaa", 0); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); @@ -84250,20 +84930,22 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ ** transaction on each used database and to verify the schema cookie ** on each used database. */ - if( pParse->cookieGoto>0 ){ + if( db->mallocFailed==0 && (pParse->cookieMask || pParse->pConstExpr) ){ yDbMask mask; - int iDb, i, addr; - sqlite3VdbeJumpHere(v, pParse->cookieGoto-1); + int iDb, i; + assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); + sqlite3VdbeJumpHere(v, 0); for(iDb=0, mask=1; iDbnDb; mask<<=1, iDb++){ if( (mask & pParse->cookieMask)==0 ) continue; sqlite3VdbeUsesBtree(v, iDb); - sqlite3VdbeAddOp2(v,OP_Transaction, iDb, (mask & pParse->writeMask)!=0); - if( db->init.busy==0 ){ - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); - sqlite3VdbeAddOp3(v, OP_VerifyCookie, - iDb, pParse->cookieValue[iDb], - db->aDb[iDb].pSchema->iGeneration); - } + sqlite3VdbeAddOp4Int(v, + OP_Transaction, /* Opcode */ + iDb, /* P1 */ + (mask & pParse->writeMask)!=0, /* P2 */ + pParse->cookieValue[iDb], /* P3 */ + db->aDb[iDb].pSchema->iGeneration /* P4 */ + ); + if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); } #ifndef SQLITE_OMIT_VIRTUALTABLE for(i=0; inVtabLock; i++){ @@ -84284,17 +84966,16 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ sqlite3AutoincrementBegin(pParse); /* Code constant expressions that where factored out of inner loops */ - addr = pParse->cookieGoto; if( pParse->pConstExpr ){ ExprList *pEL = pParse->pConstExpr; - pParse->cookieGoto = 0; + pParse->okConstFactor = 0; for(i=0; inExpr; i++){ sqlite3ExprCode(pParse, pEL->a[i].pExpr, pEL->a[i].u.iConstExprReg); } } /* Finally, jump back to the beginning of the executable code. */ - sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); + sqlite3VdbeAddOp2(v, OP_Goto, 0, 1); } } @@ -84317,7 +84998,6 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ pParse->nSet = 0; pParse->nVar = 0; pParse->cookieMask = 0; - pParse->cookieGoto = 0; } /* @@ -85049,7 +85729,7 @@ SQLITE_PRIVATE void sqlite3StartTable( reg3 = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT); sqlite3VdbeUsesBtree(v, iDb); - j1 = sqlite3VdbeAddOp1(v, OP_If, reg3); + j1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? 1 : SQLITE_MAX_FILE_FORMAT; sqlite3VdbeAddOp2(v, OP_Integer, fileFormat, reg3); @@ -86776,27 +87456,27 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ /* Open the table. Loop through all rows of the table, inserting index ** records into the sorter. */ sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); - addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); VdbeCoverage(v); regRecord = sqlite3GetTempReg(pParse); sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0); sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord); sqlite3VdbeResolveLabel(v, iPartIdxLabel); - sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); if( memRootPage<0 ) sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb); sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb, (char *)pKey, P4_KEYINFO); sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR|((memRootPage>=0)?OPFLAG_P2ISREG:0)); - addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); + addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); VdbeCoverage(v); assert( pKey!=0 || db->mallocFailed || pParse->nErr ); if( pIndex->onError!=OE_None && pKey!=0 ){ int j2 = sqlite3VdbeCurrentAddr(v) + 3; sqlite3VdbeAddOp2(v, OP_Goto, 0, j2); addr2 = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord, - pKey->nField - pIndex->nKeyCol); + pKey->nField - pIndex->nKeyCol); VdbeCoverage(v); sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); }else{ addr2 = sqlite3VdbeCurrentAddr(v); @@ -86805,7 +87485,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); sqlite3ReleaseTempReg(pParse, regRecord); - sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); + sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp1(v, OP_Close, iTab); @@ -87574,7 +88254,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( assert( iStart<=pSrc->nSrc ); /* Allocate additional space if needed */ - if( pSrc->nSrc+nExtra>pSrc->nAlloc ){ + if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; int nAlloc = pSrc->nSrc+nExtra; int nGot; @@ -87586,7 +88266,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( } pSrc = pNew; nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; - pSrc->nAlloc = (u8)nGot; + pSrc->nAlloc = nGot; } /* Move existing slots that come after the newly inserted slots @@ -87594,7 +88274,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( for(i=pSrc->nSrc-1; i>=iStart; i--){ pSrc->a[i+nExtra] = pSrc->a[i]; } - pSrc->nSrc += (i8)nExtra; + pSrc->nSrc += nExtra; /* Zero the newly allocated slots */ memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra); @@ -87926,59 +88606,26 @@ SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ } /* -** Generate VDBE code that will verify the schema cookie and start -** a read-transaction for all named database files. -** -** It is important that all schema cookies be verified and all -** read transactions be started before anything else happens in -** the VDBE program. But this routine can be called after much other -** code has been generated. So here is what we do: -** -** The first time this routine is called, we code an OP_Goto that -** will jump to a subroutine at the end of the program. Then we -** record every database that needs its schema verified in the -** pParse->cookieMask field. Later, after all other code has been -** generated, the subroutine that does the cookie verifications and -** starts the transactions will be coded and the OP_Goto P2 value -** will be made to point to that subroutine. The generation of the -** cookie verification subroutine code happens in sqlite3FinishCoding(). -** -** If iDb<0 then code the OP_Goto only - don't set flag to verify the -** schema on any databases. This can be used to position the OP_Goto -** early in the code, before we know if any database tables will be used. +** Record the fact that the schema cookie will need to be verified +** for database iDb. The code to actually verify the schema cookie +** will occur at the end of the top-level VDBE and will be generated +** later, by sqlite3FinishCoding(). */ SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ Parse *pToplevel = sqlite3ParseToplevel(pParse); + sqlite3 *db = pToplevel->db; + yDbMask mask; -#ifndef SQLITE_OMIT_TRIGGER - if( pToplevel!=pParse ){ - /* This branch is taken if a trigger is currently being coded. In this - ** case, set cookieGoto to a non-zero value to show that this function - ** has been called. This is used by the sqlite3ExprCodeConstants() - ** function. */ - pParse->cookieGoto = -1; - } -#endif - if( pToplevel->cookieGoto==0 ){ - Vdbe *v = sqlite3GetVdbe(pToplevel); - if( v==0 ) return; /* This only happens if there was a prior error */ - pToplevel->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1; - } - if( iDb>=0 ){ - sqlite3 *db = pToplevel->db; - yDbMask mask; - - assert( iDbnDb ); - assert( db->aDb[iDb].pBt!=0 || iDb==1 ); - assert( iDbcookieMask & mask)==0 ){ - pToplevel->cookieMask |= mask; - pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie; - if( !OMIT_TEMPDB && iDb==1 ){ - sqlite3OpenTempDatabase(pToplevel); - } + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 || iDb==1 ); + assert( iDbcookieMask & mask)==0 ){ + pToplevel->cookieMask |= mask; + pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie; + if( !OMIT_TEMPDB && iDb==1 ){ + sqlite3OpenTempDatabase(pToplevel); } } } @@ -88949,10 +89596,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView( SrcList *pFrom; sqlite3 *db = pParse->db; int iDb = sqlite3SchemaToIndex(db, pView->pSchema); - pWhere = sqlite3ExprDup(db, pWhere, 0); pFrom = sqlite3SrcListAppend(db, 0, 0, 0); - if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); @@ -88960,10 +89605,7 @@ SQLITE_PRIVATE void sqlite3MaterializeView( assert( pFrom->a[0].pOn==0 ); assert( pFrom->a[0].pUsing==0 ); } - pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, 0, 0, 0); - if( pSel ) pSel->selFlags |= SF_Materialize; - sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); sqlite3Select(pParse, pSel, &dest); sqlite3SelectDelete(db, pSel); @@ -89300,7 +89942,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( iKey = ++pParse->nMem; nKey = 0; /* Zero tells OP_Found to use a composite key */ sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, - sqlite3IndexAffinityStr(v, pPk), P4_TRANSIENT); + sqlite3IndexAffinityStr(v, pPk), nPk); sqlite3VdbeAddOp2(v, OP_IdxInsert, iEphCur, iKey); }else{ /* Get the rowid of the row to be deleted and remember it in the RowSet */ @@ -89338,13 +89980,15 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( if( aToOpen[iDataCur-iTabCur] ){ assert( pPk!=0 ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); + VdbeCoverage(v); } }else if( pPk ){ - addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); + addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_RowKey, iEphCur, iKey); assert( nKey==0 ); /* OP_Found will use a composite key */ }else{ addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); + VdbeCoverage(v); assert( nKey==1 ); } @@ -89368,7 +90012,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( if( okOnePass ){ sqlite3VdbeResolveLabel(v, addrBypass); }else if( pPk ){ - sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); + sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrLoop); }else{ sqlite3VdbeAddOp2(v, OP_Goto, 0, addrLoop); @@ -89466,7 +90110,11 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( ** not attempt to delete it or fire any DELETE triggers. */ iLabel = sqlite3VdbeMakeLabel(v); opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; - if( !bNoSeek ) sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); + if( !bNoSeek ){ + sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); + VdbeCoverageIf(v, opSeek==OP_NotExists); + VdbeCoverageIf(v, opSeek==OP_NotFound); + } /* If there are any triggers to fire, allocate a range of registers to ** use for the old.* references in the triggers. */ @@ -89508,6 +90156,8 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( */ if( addrStartisDeferred, iOk); + VdbeCoverage(v); } for(i=0; inCol; i++){ int iReg = aiCol[i] + regData + 1; - sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk); + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk); VdbeCoverage(v); } if( isIgnore==0 ){ @@ -91785,17 +92436,19 @@ static void fkLookupParent( ** will have INTEGER affinity applied to it, which may not be correct. */ sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[0]+1+regData, regTemp); iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); + VdbeCoverage(v); /* If the parent table is the same as the child table, and we are about ** to increment the constraint-counter (i.e. this is an INSERT operation), ** then check if the row being inserted matches itself. If so, do not ** increment the constraint-counter. */ if( pTab==pFKey->pFrom && nIncr==1 ){ - sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp); + sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); } sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); - sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk); sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); sqlite3VdbeJumpHere(v, iMustBeInt); @@ -91831,15 +92484,15 @@ static void fkLookupParent( /* The parent key is a composite key that includes the IPK column */ iParent = regData; } - sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent); + sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); } sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk); } - sqlite3VdbeAddOp3(v, OP_MakeRecord, regTemp, nCol, regRec); - sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v,pIdx), P4_TRANSIENT); - sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTemp, nCol, regRec, + sqlite3IndexAffinityStr(v,pIdx), nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v); sqlite3ReleaseTempReg(pParse, regRec); sqlite3ReleaseTempRange(pParse, regTemp, nCol); @@ -91977,6 +92630,7 @@ static void fkScanChildren( if( nIncr<0 ){ iFkIfZero = sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, 0); + VdbeCoverage(v); } /* Create an Expr object representing an SQL expression like: @@ -92139,7 +92793,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa } if( !p ) return; iSkip = sqlite3VdbeMakeLabel(v); - sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); } pParse->disableTriggers = 1; @@ -92157,6 +92811,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa */ if( (db->flags & SQLITE_DeferFKs)==0 ){ sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, OE_Abort, 0, P4_STATIC, P5_ConstraintFK); } @@ -92316,7 +92971,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; for(i=0; inCol; i++){ int iReg = pFKey->aCol[i].iFrom + regOld + 1; - sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1); } @@ -92883,10 +93538,16 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ } /* -** Set P4 of the most recently inserted opcode to a column affinity -** string for table pTab. A column affinity string has one character -** for each column indexed by the index, according to the affinity of the -** column: +** Compute the affinity string for table pTab, if it has not already been +** computed. As an optimization, omit trailing SQLITE_AFF_NONE affinities. +** +** If the affinity exists (if it is no entirely SQLITE_AFF_NONE values) and +** if iReg>0 then code an OP_Affinity opcode that will set the affinities +** for register iReg and following. Or if affinities exists and iReg==0, +** then just set the P4 operand of the previous opcode (which should be +** an OP_MakeRecord) to the affinity string. +** +** A column affinity string has one character per column: ** ** Character Column affinity ** ------------------------------ @@ -92896,19 +93557,11 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ ** 'd' INTEGER ** 'e' REAL */ -SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){ - /* The first time a column affinity string for a particular table - ** is required, it is allocated and populated here. It is then - ** stored as a member of the Table structure for subsequent use. - ** - ** The column affinity string will eventually be deleted by - ** sqlite3DeleteTable() when the Table structure itself is cleaned up. - */ - if( !pTab->zColAff ){ - char *zColAff; - int i; +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ + int i; + char *zColAff = pTab->zColAff; + if( zColAff==0 ){ sqlite3 *db = sqlite3VdbeDb(v); - zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); if( !zColAff ){ db->mallocFailed = 1; @@ -92918,22 +93571,28 @@ SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){ for(i=0; inCol; i++){ zColAff[i] = pTab->aCol[i].affinity; } - zColAff[pTab->nCol] = '\0'; - + do{ + zColAff[i--] = 0; + }while( i>=0 && zColAff[i]==SQLITE_AFF_NONE ); pTab->zColAff = zColAff; } - - sqlite3VdbeChangeP4(v, -1, pTab->zColAff, P4_TRANSIENT); + i = sqlite3Strlen30(zColAff); + if( i ){ + if( iReg ){ + sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); + }else{ + sqlite3VdbeChangeP4(v, -1, zColAff, i); + } + } } /* ** Return non-zero if the table pTab in database iDb or any of its indices -** have been opened at any point in the VDBE program beginning at location -** iStartAddr throught the end of the program. This is used to see if +** have been opened at any point in the VDBE program. This is used to see if ** a statement of the form "INSERT INTO SELECT ..." can -** run without using temporary table for the results of the SELECT. +** run without using a temporary table for the results of the SELECT. */ -static int readsTable(Parse *p, int iStartAddr, int iDb, Table *pTab){ +static int readsTable(Parse *p, int iDb, Table *pTab){ Vdbe *v = sqlite3GetVdbe(p); int i; int iEnd = sqlite3VdbeCurrentAddr(v); @@ -92941,7 +93600,7 @@ static int readsTable(Parse *p, int iStartAddr, int iDb, Table *pTab){ VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0; #endif - for(i=iStartAddr; iopcode==OP_OpenRead && pOp->p3==iDb ){ @@ -93042,14 +93701,14 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ sqlite3VdbeAddOp3(v, OP_Null, 0, memId, memId+1); addr = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, p->pTab->zName, 0); - sqlite3VdbeAddOp2(v, OP_Rewind, 0, addr+9); + sqlite3VdbeAddOp2(v, OP_Rewind, 0, addr+9); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, 0, 0, memId); - sqlite3VdbeAddOp3(v, OP_Ne, memId-1, addr+7, memId); + sqlite3VdbeAddOp3(v, OP_Ne, memId-1, addr+7, memId); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1); sqlite3VdbeAddOp3(v, OP_Column, 0, 1, memId); sqlite3VdbeAddOp2(v, OP_Goto, 0, addr+9); - sqlite3VdbeAddOp2(v, OP_Next, 0, addr+2); + sqlite3VdbeAddOp2(v, OP_Next, 0, addr+2); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, 0, memId); sqlite3VdbeAddOp0(v, OP_Close); } @@ -93084,25 +93743,16 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ assert( v ); for(p = pParse->pAinc; p; p = p->pNext){ Db *pDb = &db->aDb[p->iDb]; - int j1, j2, j3, j4, j5; + int j1; int iRec; int memId = p->regCtr; iRec = sqlite3GetTempReg(pParse); assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1); - j2 = sqlite3VdbeAddOp0(v, OP_Rewind); - j3 = sqlite3VdbeAddOp3(v, OP_Column, 0, 0, iRec); - j4 = sqlite3VdbeAddOp3(v, OP_Eq, memId-1, 0, iRec); - sqlite3VdbeAddOp2(v, OP_Next, 0, j3); - sqlite3VdbeJumpHere(v, j2); + j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_NewRowid, 0, memId+1); - j5 = sqlite3VdbeAddOp0(v, OP_Goto); - sqlite3VdbeJumpHere(v, j4); - sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1); sqlite3VdbeJumpHere(v, j1); - sqlite3VdbeJumpHere(v, j5); sqlite3VdbeAddOp3(v, OP_MakeRecord, memId-1, 2, iRec); sqlite3VdbeAddOp3(v, OP_Insert, 0, iRec, memId+1); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); @@ -93120,97 +93770,6 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ #endif /* SQLITE_OMIT_AUTOINCREMENT */ -/* -** Generate code for a co-routine that will evaluate a subquery one -** row at a time. -** -** The pSelect parameter is the subquery that the co-routine will evaluation. -** Information about the location of co-routine and the registers it will use -** is returned by filling in the pDest object. -** -** Registers are allocated as follows: -** -** pDest->iSDParm The register holding the next entry-point of the -** co-routine. Run the co-routine to its next breakpoint -** by calling "OP_Yield $X" where $X is pDest->iSDParm. -** -** pDest->iSDParm+1 The register holding the "completed" flag for the -** co-routine. This register is 0 if the previous Yield -** generated a new result row, or 1 if the subquery -** has completed. If the Yield is called again -** after this register becomes 1, then the VDBE will -** halt with an SQLITE_INTERNAL error. -** -** pDest->iSdst First result register. -** -** pDest->nSdst Number of result registers. -** -** This routine handles all of the register allocation and fills in the -** pDest structure appropriately. -** -** Here is a schematic of the generated code assuming that X is the -** co-routine entry-point register reg[pDest->iSDParm], that EOF is the -** completed flag reg[pDest->iSDParm+1], and R and S are the range of -** registers that hold the result set, reg[pDest->iSdst] through -** reg[pDest->iSdst+pDest->nSdst-1]: -** -** X <- A -** EOF <- 0 -** goto B -** A: setup for the SELECT -** loop rows in the SELECT -** load results into registers R..S -** yield X -** end loop -** cleanup after the SELECT -** EOF <- 1 -** yield X -** halt-error -** B: -** -** To use this subroutine, the caller generates code as follows: -** -** [ Co-routine generated by this subroutine, shown above ] -** S: yield X -** if EOF goto E -** if skip this row, goto C -** if terminate loop, goto E -** deal with this row -** C: goto S -** E: -*/ -SQLITE_PRIVATE int sqlite3CodeCoroutine(Parse *pParse, Select *pSelect, SelectDest *pDest){ - int regYield; /* Register holding co-routine entry-point */ - int regEof; /* Register holding co-routine completion flag */ - int addrTop; /* Top of the co-routine */ - int j1; /* Jump instruction */ - int rc; /* Result code */ - Vdbe *v; /* VDBE under construction */ - - regYield = ++pParse->nMem; - regEof = ++pParse->nMem; - v = sqlite3GetVdbe(pParse); - addrTop = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_Integer, addrTop+2, regYield); /* X <- A */ - VdbeComment((v, "Co-routine entry point")); - sqlite3VdbeAddOp2(v, OP_Integer, 0, regEof); /* EOF <- 0 */ - VdbeComment((v, "Co-routine completion flag")); - sqlite3SelectDestInit(pDest, SRT_Coroutine, regYield); - j1 = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); - rc = sqlite3Select(pParse, pSelect, pDest); - assert( pParse->nErr==0 || rc ); - if( pParse->db->mallocFailed && rc==SQLITE_OK ) rc = SQLITE_NOMEM; - if( rc ) return rc; - sqlite3VdbeAddOp2(v, OP_Integer, 1, regEof); /* EOF <- 1 */ - sqlite3VdbeAddOp1(v, OP_Yield, regYield); /* yield X */ - sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_INTERNAL, OE_Abort); - VdbeComment((v, "End of coroutine")); - sqlite3VdbeJumpHere(v, j1); /* label B: */ - return rc; -} - - - /* Forward declaration */ static int xferOptimization( Parse *pParse, /* Parser context */ @@ -93273,7 +93832,6 @@ static int xferOptimization( ** and the SELECT clause does not read from
    at any time. ** The generated code follows this template: ** -** EOF <- 0 ** X <- A ** goto B ** A: setup for the SELECT @@ -93282,12 +93840,9 @@ static int xferOptimization( ** yield X ** end loop ** cleanup after the SELECT -** EOF <- 1 -** yield X -** goto A +** end-coroutine X ** B: open write cursor to
    and its indices -** C: yield X -** if EOF goto D +** C: yield X, at EOF goto D ** insert the select result into
    from R..R+n ** goto C ** D: cleanup @@ -93298,7 +93853,6 @@ static int xferOptimization( ** we have to use a intermediate table to store the results of ** the select. The template is like this: ** -** EOF <- 0 ** X <- A ** goto B ** A: setup for the SELECT @@ -93307,12 +93861,9 @@ static int xferOptimization( ** yield X ** end loop ** cleanup after the SELECT -** EOF <- 1 -** yield X -** halt-error +** end co-routine R ** B: open temp table -** L: yield X -** if EOF goto M +** L: yield X, at EOF goto M ** insert row from R..R+n into temp table ** goto L ** M: open write cursor to
    and its indices @@ -93342,16 +93893,16 @@ SQLITE_PRIVATE void sqlite3Insert( int iIdxCur = 0; /* First index cursor */ int ipkColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ int endOfLoop; /* Label for the end of the insertion loop */ - int useTempTable = 0; /* Store SELECT results in intermediate table */ int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ int addrInsTop = 0; /* Jump to label "D" */ int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */ - int addrSelect = 0; /* Address of coroutine that implements the SELECT */ SelectDest dest; /* Destination for SELECT on rhs of INSERT */ int iDb; /* Index of database holding TABLE */ Db *pDb; /* The database containing table being inserted into */ - int appendFlag = 0; /* True if the insert is likely to be an append */ - int withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ + u8 useTempTable = 0; /* Store SELECT results in intermediate table */ + u8 appendFlag = 0; /* True if the insert is likely to be an append */ + u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ + u8 bIdListInOrder = 1; /* True if IDLIST is in table order */ ExprList *pList = 0; /* List of VALUES() to be inserted */ /* Register allocations */ @@ -93361,7 +93912,6 @@ SQLITE_PRIVATE void sqlite3Insert( int regIns; /* Block of regs holding rowid+data being inserted */ int regRowid; /* registers holding insert rowid */ int regData; /* register holding first column to insert */ - int regEof = 0; /* Register recording end of SELECT data */ int *aRegIdx = 0; /* One register allocated to each index */ #ifndef SQLITE_OMIT_TRIGGER @@ -93464,101 +94014,16 @@ SQLITE_PRIVATE void sqlite3Insert( */ regAutoinc = autoIncBegin(pParse, iDb, pTab); - /* Figure out how many columns of data are supplied. If the data - ** is coming from a SELECT statement, then generate a co-routine that - ** produces a single row of the SELECT on each invocation. The - ** co-routine is the common header to the 3rd and 4th templates. - */ - if( pSelect ){ - /* Data is coming from a SELECT. Generate a co-routine to run the SELECT */ - int rc = sqlite3CodeCoroutine(pParse, pSelect, &dest); - if( rc ) goto insert_cleanup; - - regEof = dest.iSDParm + 1; - regFromSelect = dest.iSdst; - assert( pSelect->pEList ); - nColumn = pSelect->pEList->nExpr; - assert( dest.nSdst==nColumn ); - - /* Set useTempTable to TRUE if the result of the SELECT statement - ** should be written into a temporary table (template 4). Set to - ** FALSE if each output row of the SELECT can be written directly into - ** the destination table (template 3). - ** - ** A temp table must be used if the table being updated is also one - ** of the tables being read by the SELECT statement. Also use a - ** temp table in the case of row triggers. - */ - if( pTrigger || readsTable(pParse, addrSelect, iDb, pTab) ){ - useTempTable = 1; - } - - if( useTempTable ){ - /* Invoke the coroutine to extract information from the SELECT - ** and add it to a transient table srcTab. The code generated - ** here is from the 4th template: - ** - ** B: open temp table - ** L: yield X - ** if EOF goto M - ** insert row from R..R+n into temp table - ** goto L - ** M: ... - */ - int regRec; /* Register to hold packed record */ - int regTempRowid; /* Register to hold temp table ROWID */ - int addrTop; /* Label "L" */ - int addrIf; /* Address of jump to M */ - - srcTab = pParse->nTab++; - regRec = sqlite3GetTempReg(pParse); - regTempRowid = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn); - addrTop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); - addrIf = sqlite3VdbeAddOp1(v, OP_If, regEof); - sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); - sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); - sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); - sqlite3VdbeJumpHere(v, addrIf); - sqlite3ReleaseTempReg(pParse, regRec); - sqlite3ReleaseTempReg(pParse, regTempRowid); - } - }else{ - /* This is the case if the data for the INSERT is coming from a VALUES - ** clause - */ - NameContext sNC; - memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pParse; - srcTab = -1; - assert( useTempTable==0 ); - nColumn = pList ? pList->nExpr : 0; - for(i=0; ia[i].pExpr) ){ - goto insert_cleanup; - } - } - } - - /* Make sure the number of columns in the source data matches the number - ** of columns to be inserted into the table. + /* Allocate registers for holding the rowid of the new row, + ** the content of the new row, and the assemblied row record. */ + regRowid = regIns = pParse->nMem+1; + pParse->nMem += pTab->nCol + 1; if( IsVirtual(pTab) ){ - for(i=0; inCol; i++){ - nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); - } - } - if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ - sqlite3ErrorMsg(pParse, - "table %S has %d columns but %d values were supplied", - pTabList, 0, pTab->nCol-nHidden, nColumn); - goto insert_cleanup; - } - if( pColumn!=0 && nColumn!=pColumn->nId ){ - sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); - goto insert_cleanup; + regRowid++; + pParse->nMem++; } + regData = regRowid+1; /* If the INSERT statement included an IDLIST term, then make sure ** all elements of the IDLIST really are columns of the table and @@ -93579,6 +94044,7 @@ SQLITE_PRIVATE void sqlite3Insert( for(j=0; jnCol; j++){ if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){ pColumn->a[i].idx = j; + if( i!=j ) bIdListInOrder = 0; if( j==pTab->iPKey ){ ipkColumn = i; assert( !withoutRowid ); } @@ -93598,6 +94064,90 @@ SQLITE_PRIVATE void sqlite3Insert( } } + /* Figure out how many columns of data are supplied. If the data + ** is coming from a SELECT statement, then generate a co-routine that + ** produces a single row of the SELECT on each invocation. The + ** co-routine is the common header to the 3rd and 4th templates. + */ + if( pSelect ){ + /* Data is coming from a SELECT. Generate a co-routine to run the SELECT */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int rc; /* Result code */ + + regYield = ++pParse->nMem; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + dest.iSdst = bIdListInOrder ? regData : 0; + dest.nSdst = pTab->nCol; + rc = sqlite3Select(pParse, pSelect, &dest); + regFromSelect = dest.iSdst; + assert( pParse->nErr==0 || rc ); + if( rc || db->mallocFailed ) goto insert_cleanup; + sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ + assert( pSelect->pEList ); + nColumn = pSelect->pEList->nExpr; + + /* Set useTempTable to TRUE if the result of the SELECT statement + ** should be written into a temporary table (template 4). Set to + ** FALSE if each output row of the SELECT can be written directly into + ** the destination table (template 3). + ** + ** A temp table must be used if the table being updated is also one + ** of the tables being read by the SELECT statement. Also use a + ** temp table in the case of row triggers. + */ + if( pTrigger || readsTable(pParse, iDb, pTab) ){ + useTempTable = 1; + } + + if( useTempTable ){ + /* Invoke the coroutine to extract information from the SELECT + ** and add it to a transient table srcTab. The code generated + ** here is from the 4th template: + ** + ** B: open temp table + ** L: yield X, goto M at EOF + ** insert row from R..R+n into temp table + ** goto L + ** M: ... + */ + int regRec; /* Register to hold packed record */ + int regTempRowid; /* Register to hold temp table ROWID */ + int addrL; /* Label "L" */ + + srcTab = pParse->nTab++; + regRec = sqlite3GetTempReg(pParse); + regTempRowid = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn); + addrL = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); + sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); + sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrL); + sqlite3VdbeJumpHere(v, addrL); + sqlite3ReleaseTempReg(pParse, regRec); + sqlite3ReleaseTempReg(pParse, regTempRowid); + } + }else{ + /* This is the case if the data for the INSERT is coming from a VALUES + ** clause + */ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + srcTab = -1; + assert( useTempTable==0 ); + nColumn = pList ? pList->nExpr : 0; + for(i=0; ia[i].pExpr) ){ + goto insert_cleanup; + } + } + } + /* If there is no IDLIST term but the table has an integer primary ** key, the set the ipkColumn variable to the integer primary key ** column index in the original table definition. @@ -93605,6 +94155,25 @@ SQLITE_PRIVATE void sqlite3Insert( if( pColumn==0 && nColumn>0 ){ ipkColumn = pTab->iPKey; } + + /* Make sure the number of columns in the source data matches the number + ** of columns to be inserted into the table. + */ + if( IsVirtual(pTab) ){ + for(i=0; inCol; i++){ + nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); + } + } + if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ + sqlite3ErrorMsg(pParse, + "table %S has %d columns but %d values were supplied", + pTabList, 0, pTab->nCol-nHidden, nColumn); + goto insert_cleanup; + } + if( pColumn!=0 && nColumn!=pColumn->nId ){ + sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); + goto insert_cleanup; + } /* Initialize the count of rows to be inserted */ @@ -93632,39 +94201,27 @@ SQLITE_PRIVATE void sqlite3Insert( /* This block codes the top of loop only. The complete loop is the ** following pseudocode (template 4): ** - ** rewind temp table + ** rewind temp table, if empty goto D ** C: loop over rows of intermediate table ** transfer values form intermediate table into
    ** end loop ** D: ... */ - addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); + addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); VdbeCoverage(v); addrCont = sqlite3VdbeCurrentAddr(v); }else if( pSelect ){ /* This block codes the top of loop only. The complete loop is the ** following pseudocode (template 3): ** - ** C: yield X - ** if EOF goto D + ** C: yield X, at EOF goto D ** insert the select result into
    from R..R+n ** goto C ** D: ... */ - addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); - addrInsTop = sqlite3VdbeAddOp1(v, OP_If, regEof); + addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); } - /* Allocate registers for holding the rowid of the new row, - ** the content of the new row, and the assemblied row record. - */ - regRowid = regIns = pParse->nMem+1; - pParse->nMem += pTab->nCol + 1; - if( IsVirtual(pTab) ){ - regRowid++; - pParse->nMem++; - } - regData = regRowid+1; - /* Run the BEFORE and INSTEAD OF triggers, if there are any */ endOfLoop = sqlite3VdbeMakeLabel(v); @@ -93688,10 +94245,10 @@ SQLITE_PRIVATE void sqlite3Insert( assert( pSelect==0 ); /* Otherwise useTempTable is true */ sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); } - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); + j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); sqlite3VdbeJumpHere(v, j1); - sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); } /* Cannot have triggers on a virtual table. If it were possible, @@ -93725,8 +94282,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** table column affinities. */ if( !isView ){ - sqlite3VdbeAddOp2(v, OP_Affinity, regCols+1, pTab->nCol); - sqlite3TableAffinityStr(v, pTab); + sqlite3TableAffinity(v, pTab, regCols+1); } /* Fire BEFORE or INSTEAD OF triggers */ @@ -93748,7 +94304,7 @@ SQLITE_PRIVATE void sqlite3Insert( if( useTempTable ){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); }else if( pSelect ){ - sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+ipkColumn, regRowid); + sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); }else{ VdbeOp *pOp; sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); @@ -93767,14 +94323,14 @@ SQLITE_PRIVATE void sqlite3Insert( if( !appendFlag ){ int j1; if( !IsVirtual(pTab) ){ - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); + j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); sqlite3VdbeJumpHere(v, j1); }else{ j1 = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, j1+2); + sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, j1+2); VdbeCoverage(v); } - sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); } }else if( IsVirtual(pTab) || withoutRowid ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); @@ -93794,8 +94350,9 @@ SQLITE_PRIVATE void sqlite3Insert( /* The value of the INTEGER PRIMARY KEY column is always a NULL. ** Whenever this column is read, the rowid will be substituted ** in its place. Hence, fill this column with a NULL to avoid - ** taking up data space with information that will never be used. */ - sqlite3VdbeAddOp2(v, OP_Null, 0, iRegStore); + ** taking up data space with information that will never be used. + ** As there may be shallow copies of this value, make it a soft-NULL */ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); continue; } if( pColumn==0 ){ @@ -93812,11 +94369,13 @@ SQLITE_PRIVATE void sqlite3Insert( } } if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore); + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); }else if( useTempTable ){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); }else if( pSelect ){ - sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); + if( regFromSelect!=regData ){ + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); + } }else{ sqlite3ExprCode(pParse, pList->a[j].pExpr, iRegStore); } @@ -93862,7 +94421,7 @@ SQLITE_PRIVATE void sqlite3Insert( */ sqlite3VdbeResolveLabel(v, endOfLoop); if( useTempTable ){ - sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); + sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrInsTop); sqlite3VdbeAddOp1(v, OP_Close, srcTab); }else if( pSelect ){ @@ -94029,6 +94588,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int ipkTop = 0; /* Top of the rowid change constraint check */ int ipkBottom = 0; /* Bottom of the rowid change constraint check */ u8 isUpdate; /* True if this is an UPDATE operation */ + u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */ int regRowid = -1; /* Register holding ROWID value */ isUpdate = regOldData!=0; @@ -94083,15 +94643,17 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp4(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, regNewData+1+i, zMsg, P4_DYNAMIC); sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); + VdbeCoverage(v); break; } case OE_Ignore: { sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); + VdbeCoverage(v); break; } default: { assert( onError==OE_Replace ); - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); + j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); VdbeCoverage(v); sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); sqlite3VdbeJumpHere(v, j1); break; @@ -94143,6 +94705,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** it might have changed. Skip the conflict logic below if the rowid ** is unchanged. */ sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); } /* If the response to a rowid conflict is REPLACE but the response @@ -94162,6 +94726,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* Check to see if the new rowid already exists in the table. Skip ** the following conflict logic if it does not. */ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); + VdbeCoverage(v); /* Generate code that deals with a rowid collision */ switch( onError ){ @@ -94240,6 +94805,10 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ + if( bAffinityDone==0 ){ + sqlite3TableAffinity(v, pTab, regNewData+1); + bAffinityDone = 1; + } iThisCur = iIdxCur+ix; addrUniqueOk = sqlite3VdbeMakeLabel(v); @@ -94270,7 +94839,6 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); - sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), P4_TRANSIENT); VdbeComment((v, "for %s", pIdx->zName)); sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn); @@ -94298,7 +94866,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* Check to see if the new index entry will be unique */ sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, - regIdx, pIdx->nKeyCol); + regIdx, pIdx->nKeyCol); VdbeCoverage(v); /* Generate code to handle collisions */ regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); @@ -94309,6 +94877,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** is different from old-rowid */ if( isUpdate ){ sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); } }else{ int x; @@ -94344,6 +94914,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp4(v, op, regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ ); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverageIf(v, op==OP_Eq); + VdbeCoverageIf(v, op==OP_Ne); } } } @@ -94415,14 +94988,17 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( int regData; /* Content registers (after the rowid) */ int regRec; /* Register holding assemblied record for the table */ int i; /* Loop counter */ + u8 bAffinityDone = 0; /* True if OP_Affinity has been run already */ v = sqlite3GetVdbe(pParse); assert( v!=0 ); assert( pTab->pSelect==0 ); /* This table is not a VIEW */ for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ if( aRegIdx[i]==0 ) continue; + bAffinityDone = 1; if( pIdx->pPartIdxWhere ){ sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i]); pik_flags = 0; @@ -94437,7 +95013,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( regData = regNewData + 1; regRec = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec); - sqlite3TableAffinityStr(v, pTab); + if( !bAffinityDone ) sqlite3TableAffinity(v, pTab, 0); sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol); if( pParse->nested ){ pik_flags = 0; @@ -94806,16 +95382,17 @@ static int xferOptimization( ** ** (3) onError is something other than OE_Abort and OE_Rollback. */ - addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); VdbeCoverage(v); emptyDestTest = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); sqlite3VdbeJumpHere(v, addr1); } if( HasRowid(pSrc) ){ sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); - emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); + emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); if( pDest->iPKey>=0 ){ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid); + VdbeCoverage(v); sqlite3RowidConstraint(pParse, onError, pDest); sqlite3VdbeJumpHere(v, addr2); autoIncStep(pParse, regAutoinc, regRowid); @@ -94829,7 +95406,7 @@ static int xferOptimization( sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid); sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND); sqlite3VdbeChangeP4(v, -1, pDest->zName, 0); - sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); }else{ @@ -94848,15 +95425,15 @@ static int xferOptimization( sqlite3VdbeSetP4KeyInfo(pParse, pDestIdx); sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); VdbeComment((v, "%s", pDestIdx->zName)); - addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_RowKey, iSrc, regData); sqlite3VdbeAddOp3(v, OP_IdxInsert, iDest, regData, 1); - sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); } - sqlite3VdbeJumpHere(v, emptySrcTest); + if( emptySrcTest ) sqlite3VdbeJumpHere(v, emptySrcTest); sqlite3ReleaseTempReg(pParse, regRowid); sqlite3ReleaseTempReg(pParse, regData); if( emptyDestTest ){ @@ -97090,6 +97667,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** size of historical compatibility. */ case PragTyp_DEFAULT_CACHE_SIZE: { + static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList getCacheSize[] = { { OP_Transaction, 0, 0, 0}, /* 0 */ { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */ @@ -97107,7 +97685,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC); pParse->nMem += 2; - addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); + addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize,iLn); sqlite3VdbeChangeP1(v, addr, iDb); sqlite3VdbeChangeP1(v, addr+1, iDb); sqlite3VdbeChangeP1(v, addr+6, SQLITE_DEFAULT_CACHE_SIZE); @@ -97352,6 +97930,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** file. Before writing to meta[6], check that meta[3] indicates ** that this really is an auto-vacuum capable database. */ + static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList setMeta6[] = { { OP_Transaction, 0, 1, 0}, /* 0 */ { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE}, @@ -97361,7 +97940,7 @@ SQLITE_PRIVATE void sqlite3Pragma( { OP_SetCookie, 0, BTREE_INCR_VACUUM, 1}, /* 5 */ }; int iAddr; - iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6); + iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6, iLn); sqlite3VdbeChangeP1(v, iAddr, iDb); sqlite3VdbeChangeP1(v, iAddr+1, iDb); sqlite3VdbeChangeP2(v, iAddr+2, iAddr+4); @@ -97387,10 +97966,10 @@ SQLITE_PRIVATE void sqlite3Pragma( } sqlite3BeginWriteOperation(pParse, 0, iDb); sqlite3VdbeAddOp2(v, OP_Integer, iLimit, 1); - addr = sqlite3VdbeAddOp1(v, OP_IncrVacuum, iDb); + addr = sqlite3VdbeAddOp1(v, OP_IncrVacuum, iDb); VdbeCoverage(v); sqlite3VdbeAddOp1(v, OP_ResultRow, 1); sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); - sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr); + sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr); break; } @@ -97961,7 +98540,7 @@ SQLITE_PRIVATE void sqlite3Pragma( assert( pParse->nErr>0 || pFK==0 ); if( pFK ) break; if( pParse->nTabnTab = i; - addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v); for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); pIdx = 0; @@ -97977,26 +98556,26 @@ SQLITE_PRIVATE void sqlite3Pragma( if( iKey!=pTab->iPKey ){ sqlite3VdbeAddOp3(v, OP_Column, 0, iKey, regRow); sqlite3ColumnDefault(v, pTab, iKey, regRow); - sqlite3VdbeAddOp2(v, OP_IsNull, regRow, addrOk); - sqlite3VdbeAddOp2(v, OP_MustBeInt, regRow, - sqlite3VdbeCurrentAddr(v)+3); + sqlite3VdbeAddOp2(v, OP_IsNull, regRow, addrOk); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_MustBeInt, regRow, + sqlite3VdbeCurrentAddr(v)+3); VdbeCoverage(v); }else{ sqlite3VdbeAddOp2(v, OP_Rowid, 0, regRow); } - sqlite3VdbeAddOp3(v, OP_NotExists, i, 0, regRow); + sqlite3VdbeAddOp3(v, OP_NotExists, i, 0, regRow); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, addrOk); sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); }else{ for(j=0; jnCol; j++){ sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, aiCols ? aiCols[j] : pFK->aCol[j].iFrom, regRow+j); - sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); + sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); } if( pParent ){ - sqlite3VdbeAddOp3(v, OP_MakeRecord, regRow, pFK->nCol, regKey); - sqlite3VdbeChangeP4(v, -1, - sqlite3IndexAffinityStr(v,pIdx), P4_TRANSIENT); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, + sqlite3IndexAffinityStr(v,pIdx), pFK->nCol); sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); + VdbeCoverage(v); } } sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1); @@ -98007,7 +98586,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3VdbeResolveLabel(v, addrOk); sqlite3DbFree(db, aiCols); } - sqlite3VdbeAddOp2(v, OP_Next, 0, addrTop+1); + sqlite3VdbeAddOp2(v, OP_Next, 0, addrTop+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrTop); } } @@ -98054,6 +98633,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** messages have been generated, output OK. Otherwise output the ** error message */ + static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList endCode[] = { { OP_AddImm, 1, 0, 0}, /* 0 */ { OP_IfNeg, 1, 0, 0}, /* 1 */ @@ -98102,6 +98682,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3CodeVerifySchema(pParse, i); addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */ + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); sqlite3VdbeJumpHere(v, addr); @@ -98133,7 +98714,7 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Do the b-tree integrity checks */ sqlite3VdbeAddOp3(v, OP_IntegrityCk, 2, cnt, 1); sqlite3VdbeChangeP5(v, (u8)i); - addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); + addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName), P4_DYNAMIC); @@ -98155,6 +98736,7 @@ SQLITE_PRIVATE void sqlite3Pragma( if( pTab->pIndex==0 ) continue; pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */ + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); sqlite3VdbeJumpHere(v, addr); sqlite3ExprCacheClear(pParse); @@ -98165,7 +98747,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ } pParse->nMem = MAX(pParse->nMem, 8+j); - sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); + sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int jmp2, jmp3, jmp4; @@ -98175,7 +98757,7 @@ SQLITE_PRIVATE void sqlite3Pragma( pPrior = pIdx; sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1); /* increment entry count */ jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, 0, r1, - pIdx->nColumn); + pIdx->nColumn); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, "row ", P4_STATIC); sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); @@ -98185,13 +98767,13 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, pIdx->zName, P4_TRANSIENT); sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); - jmp4 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); + jmp4 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); sqlite3VdbeAddOp0(v, OP_Halt); sqlite3VdbeJumpHere(v, jmp4); sqlite3VdbeJumpHere(v, jmp2); sqlite3VdbeResolveLabel(v, jmp3); } - sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); + sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); sqlite3VdbeJumpHere(v, loopTop-1); #ifndef SQLITE_OMIT_BTREECOUNT sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, @@ -98199,10 +98781,11 @@ SQLITE_PRIVATE void sqlite3Pragma( for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ if( pPk==pIdx ) continue; addr = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr+2); + sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr+2); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); - sqlite3VdbeAddOp3(v, OP_Eq, 8+j, addr+8, 3); + sqlite3VdbeAddOp3(v, OP_Eq, 8+j, addr+8, 3); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pIdx->zName, P4_TRANSIENT); sqlite3VdbeAddOp3(v, OP_Concat, 3, 2, 7); @@ -98211,7 +98794,7 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif /* SQLITE_OMIT_BTREECOUNT */ } } - addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode); + addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); sqlite3VdbeChangeP2(v, addr, -mxErr); sqlite3VdbeJumpHere(v, addr+1); sqlite3VdbeChangeP4(v, addr+2, "ok", P4_STATIC); @@ -98349,7 +98932,7 @@ SQLITE_PRIVATE void sqlite3Pragma( { OP_Integer, 0, 1, 0}, /* 1 */ { OP_SetCookie, 0, 0, 1}, /* 2 */ }; - int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie); + int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie, 0); sqlite3VdbeChangeP1(v, addr, iDb); sqlite3VdbeChangeP1(v, addr+1, sqlite3Atoi(zRight)); sqlite3VdbeChangeP1(v, addr+2, iDb); @@ -98361,7 +98944,7 @@ SQLITE_PRIVATE void sqlite3Pragma( { OP_ReadCookie, 0, 1, 0}, /* 1 */ { OP_ResultRow, 1, 1, 0} }; - int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie); + int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie, 0); sqlite3VdbeChangeP1(v, addr, iDb); sqlite3VdbeChangeP1(v, addr+1, iDb); sqlite3VdbeChangeP3(v, addr+1, iCookie); @@ -99568,6 +100151,14 @@ SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){ } } +/* +** Return a pointer to the right-most SELECT statement in a compound. +*/ +static Select *findRightmost(Select *p){ + while( p->pNext ) p = p->pNext; + return p; +} + /* ** Given 1 to 3 identifiers preceding the JOIN keyword, determine the ** type of join. Return an integer constant that expresses that type @@ -99906,7 +100497,7 @@ static void pushOntoSorter( }else{ iLimit = pSelect->iLimit; } - addr1 = sqlite3VdbeAddOp1(v, OP_IfZero, iLimit); + addr1 = sqlite3VdbeAddOp1(v, OP_IfZero, iLimit); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_AddImm, iLimit, -1); addr2 = sqlite3VdbeAddOp0(v, OP_Goto); sqlite3VdbeJumpHere(v, addr1); @@ -99927,7 +100518,7 @@ static void codeOffset( if( iOffset>0 && iContinue!=0 ){ int addr; sqlite3VdbeAddOp2(v, OP_AddImm, iOffset, -1); - addr = sqlite3VdbeAddOp1(v, OP_IfNeg, iOffset); + addr = sqlite3VdbeAddOp1(v, OP_IfNeg, iOffset); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, iContinue); VdbeComment((v, "skip OFFSET records")); sqlite3VdbeJumpHere(v, addr); @@ -99955,7 +100546,7 @@ static void codeDistinct( v = pParse->pVdbe; r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); + sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1); sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1); sqlite3ReleaseTempReg(pParse, r1); @@ -100036,13 +100627,19 @@ static void selectInnerLoop( /* Pull the requested columns. */ nResultCol = pEList->nExpr; + if( pDest->iSdst==0 ){ pDest->iSdst = pParse->nMem+1; - pDest->nSdst = nResultCol; pParse->nMem += nResultCol; - }else{ - assert( pDest->nSdst==nResultCol ); + }else if( pDest->iSdst+nResultCol > pParse->nMem ){ + /* This is an error condition that can result, for example, when a SELECT + ** on the right-hand side of an INSERT contains more result columns than + ** there are columns in the table on the left. The error will be caught + ** and reported later. But we need to make sure enough memory is allocated + ** to avoid other spurious errors in the meantime. */ + pParse->nMem += nResultCol; } + pDest->nSdst = nResultCol; regResult = pDest->iSdst; if( srcTab>=0 ){ for(i=0; ia[i].pExpr); if( iiLimit ){ - sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); + sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); VdbeCoverage(v); } } @@ -100529,12 +101127,13 @@ static void generateSortTail( int ptab2 = pParse->nTab++; sqlite3VdbeAddOp3(v, OP_OpenPseudo, ptab2, regSortOut, pOrderBy->nExpr+2); addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); + VdbeCoverage(v); codeOffset(v, p->iOffset, addrContinue); sqlite3VdbeAddOp2(v, OP_SorterData, iTab, regSortOut); sqlite3VdbeAddOp3(v, OP_Column, ptab2, pOrderBy->nExpr+1, regRow); sqlite3VdbeChangeP5(v, OPFLAG_CLEARCACHE); }else{ - addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); + addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v); codeOffset(v, p->iOffset, addrContinue); sqlite3VdbeAddOp3(v, OP_Column, iTab, pOrderBy->nExpr+1, regRow); } @@ -100592,9 +101191,9 @@ static void generateSortTail( */ sqlite3VdbeResolveLabel(v, addrContinue); if( p->selFlags & SF_UseSorter ){ - sqlite3VdbeAddOp2(v, OP_SorterNext, iTab, addr); + sqlite3VdbeAddOp2(v, OP_SorterNext, iTab, addr); VdbeCoverage(v); }else{ - sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); VdbeCoverage(v); } sqlite3VdbeResolveLabel(v, addrBreak); if( eDest==SRT_Output || eDest==SRT_Coroutine ){ @@ -100965,7 +101564,7 @@ static int selectColumnsFromExprList( char *zNewName; int k; for(k=nName-1; k>1 && sqlite3Isdigit(zName[k]); k--){} - if( zName[k]==':' ) nName = k; + if( k>=0 && zName[k]==':' ) nName = k; zName[nName] = 0; zNewName = sqlite3MPrintf(db, "%s:%d", zName, ++cnt); sqlite3DbFree(db, zName); @@ -101078,11 +101677,13 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ Vdbe *v = pParse->pVdbe; if( v==0 ){ v = pParse->pVdbe = sqlite3VdbeCreate(pParse); -#ifndef SQLITE_OMIT_TRACE - if( v ){ - sqlite3VdbeAddOp0(v, OP_Trace); + if( v ) sqlite3VdbeAddOp0(v, OP_Init); + if( pParse->pToplevel==0 + && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst) + ){ + pParse->okConstFactor = 1; } -#endif + } return v; } @@ -101140,22 +101741,22 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ } }else{ sqlite3ExprCode(pParse, p->pLimit, iLimit); - sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); VdbeComment((v, "LIMIT counter")); - sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak); + sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak); VdbeCoverage(v); } if( p->pOffset ){ p->iOffset = iOffset = ++pParse->nMem; pParse->nMem++; /* Allocate an extra register for limit+offset */ sqlite3ExprCode(pParse, p->pOffset, iOffset); - sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); VdbeComment((v, "OFFSET counter")); - addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset); + addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, 0, iOffset); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp3(v, OP_Add, iLimit, iOffset, iOffset+1); VdbeComment((v, "LIMIT+OFFSET")); - addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iLimit); + addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iLimit); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, -1, iOffset+1); sqlite3VdbeJumpHere(v, addr1); } @@ -101338,11 +101939,13 @@ static void generateWithRecursiveQuery( p->pOrderBy = 0; /* Store the results of the setup-query in Queue. */ + pSetup->pNext = 0; rc = sqlite3Select(pParse, pSetup, &destQueue); + pSetup->pNext = p; if( rc ) goto end_of_recursive_query; /* Find the next row in the Queue and output that row */ - addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iQueue, addrBreak); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iQueue, addrBreak); VdbeCoverage(v); /* Transfer the next row in Queue over to Current */ sqlite3VdbeAddOp1(v, OP_NullRow, iCurrent); /* To reset column cache */ @@ -101358,7 +101961,10 @@ static void generateWithRecursiveQuery( codeOffset(v, regOffset, addrCont); selectInnerLoop(pParse, p, p->pEList, iCurrent, 0, 0, pDest, addrCont, addrBreak); - if( regLimit ) sqlite3VdbeAddOp3(v, OP_IfZero, regLimit, addrBreak, -1); + if( regLimit ){ + sqlite3VdbeAddOp3(v, OP_IfZero, regLimit, addrBreak, -1); + VdbeCoverage(v); + } sqlite3VdbeResolveLabel(v, addrCont); /* Execute the recursive SELECT taking the single row in Current as @@ -101443,8 +102049,6 @@ static int multiSelect( assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION ); db = pParse->db; pPrior = p->pPrior; - assert( pPrior->pRightmost!=pPrior ); - assert( pPrior->pRightmost==p->pRightmost ); dest = *pDest; if( pPrior->pOrderBy ){ sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before", @@ -101520,7 +102124,7 @@ static int multiSelect( p->iLimit = pPrior->iLimit; p->iOffset = pPrior->iOffset; if( p->iLimit ){ - addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit); + addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit); VdbeCoverage(v); VdbeComment((v, "Jump ahead if LIMIT reached")); } explainSetInteger(iSub2, pParse->iNextSelectId); @@ -101552,12 +102156,10 @@ static int multiSelect( testcase( p->op==TK_EXCEPT ); testcase( p->op==TK_UNION ); priorOp = SRT_Union; - if( dest.eDest==priorOp && ALWAYS(!p->pLimit &&!p->pOffset) ){ + if( dest.eDest==priorOp ){ /* We can reuse a temporary table generated by a SELECT to our ** right. */ - assert( p->pRightmost!=p ); /* Can only happen for leftward elements - ** of a 3-way or more compound */ assert( p->pLimit==0 ); /* Not allowed on leftward elements */ assert( p->pOffset==0 ); /* Not allowed on leftward elements */ unionTab = dest.iSDParm; @@ -101570,7 +102172,7 @@ static int multiSelect( addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0); assert( p->addrOpenEphm[0] == -1 ); p->addrOpenEphm[0] = addr; - p->pRightmost->selFlags |= SF_UsesEphemeral; + findRightmost(p)->selFlags |= SF_UsesEphemeral; assert( p->pEList ); } @@ -101629,12 +102231,12 @@ static int multiSelect( iBreak = sqlite3VdbeMakeLabel(v); iCont = sqlite3VdbeMakeLabel(v); computeLimitRegisters(pParse, p, iBreak); - sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); iStart = sqlite3VdbeCurrentAddr(v); selectInnerLoop(pParse, p, p->pEList, unionTab, 0, 0, &dest, iCont, iBreak); sqlite3VdbeResolveLabel(v, iCont); - sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); + sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v); sqlite3VdbeResolveLabel(v, iBreak); sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0); } @@ -101659,7 +102261,7 @@ static int multiSelect( addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); assert( p->addrOpenEphm[0] == -1 ); p->addrOpenEphm[0] = addr; - p->pRightmost->selFlags |= SF_UsesEphemeral; + findRightmost(p)->selFlags |= SF_UsesEphemeral; assert( p->pEList ); /* Code the SELECTs to our left into temporary table "tab1". @@ -101704,15 +102306,15 @@ static int multiSelect( iBreak = sqlite3VdbeMakeLabel(v); iCont = sqlite3VdbeMakeLabel(v); computeLimitRegisters(pParse, p, iBreak); - sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); iStart = sqlite3VdbeAddOp2(v, OP_RowKey, tab1, r1); - sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); + sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); VdbeCoverage(v); sqlite3ReleaseTempReg(pParse, r1); selectInnerLoop(pParse, p, p->pEList, tab1, 0, 0, &dest, iCont, iBreak); sqlite3VdbeResolveLabel(v, iCont); - sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); + sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v); sqlite3VdbeResolveLabel(v, iBreak); sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); @@ -101738,7 +102340,7 @@ static int multiSelect( CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */ int nCol; /* Number of columns in result set */ - assert( p->pRightmost==p ); + assert( p->pNext==0 ); nCol = p->pEList->nExpr; pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1); if( !pKeyInfo ){ @@ -101819,10 +102421,10 @@ static int generateOutputSubroutine( */ if( regPrev ){ int j1, j2; - j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); + j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); - sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2); + sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2); VdbeCoverage(v); sqlite3VdbeJumpHere(v, j1); sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1); sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); @@ -101923,7 +102525,7 @@ static int generateOutputSubroutine( /* Jump to the end of the loop if the LIMIT is reached. */ if( p->iLimit ){ - sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); + sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); VdbeCoverage(v); } /* Generate the subroutine return @@ -102031,9 +102633,7 @@ static int multiSelectOrderBy( SelectDest destA; /* Destination for coroutine A */ SelectDest destB; /* Destination for coroutine B */ int regAddrA; /* Address register for select-A coroutine */ - int regEofA; /* Flag to indicate when select-A is complete */ int regAddrB; /* Address register for select-B coroutine */ - int regEofB; /* Flag to indicate when select-B is complete */ int addrSelectA; /* Address of the select-A coroutine */ int addrSelectB; /* Address of the select-B coroutine */ int regOutA; /* Address register for the output-A subroutine */ @@ -102041,6 +102641,7 @@ static int multiSelectOrderBy( int addrOutA; /* Address of the output-A subroutine */ int addrOutB = 0; /* Address of the output-B subroutine */ int addrEofA; /* Address of the select-A-exhausted subroutine */ + int addrEofA_noB; /* Alternate addrEofA if B is uninitialized */ int addrEofB; /* Address of the select-B-exhausted subroutine */ int addrAltB; /* Address of the ApPrior = 0; + pPrior->pNext = 0; sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER"); if( pPrior->pPrior==0 ){ sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER"); @@ -102177,37 +102779,30 @@ static int multiSelectOrderBy( p->pOffset = 0; regAddrA = ++pParse->nMem; - regEofA = ++pParse->nMem; regAddrB = ++pParse->nMem; - regEofB = ++pParse->nMem; regOutA = ++pParse->nMem; regOutB = ++pParse->nMem; sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA); sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB); - /* Jump past the various subroutines and coroutines to the main - ** merge loop - */ - j1 = sqlite3VdbeAddOp0(v, OP_Goto); - addrSelectA = sqlite3VdbeCurrentAddr(v); - - /* Generate a coroutine to evaluate the SELECT statement to the ** left of the compound operator - the "A" select. */ - VdbeNoopComment((v, "Begin coroutine for left SELECT")); + addrSelectA = sqlite3VdbeCurrentAddr(v) + 1; + j1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); + VdbeComment((v, "left SELECT")); pPrior->iLimit = regLimitA; explainSetInteger(iSub1, pParse->iNextSelectId); sqlite3Select(pParse, pPrior, &destA); - sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofA); - sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); - VdbeNoopComment((v, "End coroutine for left SELECT")); + sqlite3VdbeAddOp1(v, OP_EndCoroutine, regAddrA); + sqlite3VdbeJumpHere(v, j1); /* Generate a coroutine to evaluate the SELECT statement on ** the right - the "B" select */ - addrSelectB = sqlite3VdbeCurrentAddr(v); - VdbeNoopComment((v, "Begin coroutine for right SELECT")); + addrSelectB = sqlite3VdbeCurrentAddr(v) + 1; + j1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); + VdbeComment((v, "right SELECT")); savedLimit = p->iLimit; savedOffset = p->iOffset; p->iLimit = regLimitB; @@ -102216,9 +102811,7 @@ static int multiSelectOrderBy( sqlite3Select(pParse, p, &destB); p->iLimit = savedLimit; p->iOffset = savedOffset; - sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofB); - sqlite3VdbeAddOp1(v, OP_Yield, regAddrB); - VdbeNoopComment((v, "End coroutine for right SELECT")); + sqlite3VdbeAddOp1(v, OP_EndCoroutine, regAddrB); /* Generate a subroutine that outputs the current row of the A ** select as the next output row of the compound select. @@ -102242,13 +102835,13 @@ static int multiSelectOrderBy( /* Generate a subroutine to run when the results from select A ** are exhausted and only data in select B remains. */ - VdbeNoopComment((v, "eof-A subroutine")); if( op==TK_EXCEPT || op==TK_INTERSECT ){ - addrEofA = sqlite3VdbeAddOp2(v, OP_Goto, 0, labelEnd); + addrEofA_noB = addrEofA = labelEnd; }else{ - addrEofA = sqlite3VdbeAddOp2(v, OP_If, regEofB, labelEnd); - sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); - sqlite3VdbeAddOp1(v, OP_Yield, regAddrB); + VdbeNoopComment((v, "eof-A subroutine")); + addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); + addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofA); p->nSelectRow += pPrior->nSelectRow; } @@ -102261,9 +102854,8 @@ static int multiSelectOrderBy( if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; }else{ VdbeNoopComment((v, "eof-B subroutine")); - addrEofB = sqlite3VdbeAddOp2(v, OP_If, regEofA, labelEnd); - sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); - sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); + addrEofB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, labelEnd); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofB); } @@ -102271,8 +102863,7 @@ static int multiSelectOrderBy( */ VdbeNoopComment((v, "A-lt-B subroutine")); addrAltB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); - sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); - sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); /* Generate code to handle the case of A==B @@ -102285,8 +102876,7 @@ static int multiSelectOrderBy( }else{ VdbeNoopComment((v, "A-eq-B subroutine")); addrAeqB = - sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); - sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); } @@ -102297,19 +102887,14 @@ static int multiSelectOrderBy( if( op==TK_ALL || op==TK_UNION ){ sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); } - sqlite3VdbeAddOp1(v, OP_Yield, regAddrB); - sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); /* This code runs once to initialize everything. */ sqlite3VdbeJumpHere(v, j1); - sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofA); - sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofB); - sqlite3VdbeAddOp2(v, OP_Gosub, regAddrA, addrSelectA); - sqlite3VdbeAddOp2(v, OP_Gosub, regAddrB, addrSelectB); - sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA); - sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA_noB); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); /* Implement the main merge loop */ @@ -102318,7 +102903,7 @@ static int multiSelectOrderBy( sqlite3VdbeAddOp4(v, OP_Compare, destA.iSdst, destB.iSdst, nOrderBy, (char*)pKeyMerge, P4_KEYINFO); sqlite3VdbeChangeP5(v, OPFLAG_PERMUTE); - sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); + sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); VdbeCoverage(v); /* Jump to the this point in order to terminate the query. */ @@ -102338,6 +102923,7 @@ static int multiSelectOrderBy( sqlite3SelectDelete(db, p->pPrior); } p->pPrior = pPrior; + pPrior->pNext = p; /*** TBD: Insert subroutine calls to close cursors on incomplete **** subqueries ****/ @@ -102603,7 +103189,7 @@ static int flattenSubquery( ** and (14). */ if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ if( pSub->pOffset ) return 0; /* Restriction (14) */ - if( p->pRightmost && pSub->pLimit ){ + if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){ return 0; /* Restriction (15) */ } if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ @@ -102754,14 +103340,14 @@ static int flattenSubquery( p->pOrderBy = pOrderBy; p->pSrc = pSrc; p->op = TK_ALL; - p->pRightmost = 0; if( pNew==0 ){ - pNew = pPrior; + p->pPrior = pPrior; }else{ pNew->pPrior = pPrior; - pNew->pRightmost = 0; + if( pPrior ) pPrior->pNext = pNew; + pNew->pNext = p; + p->pPrior = pNew; } - p->pPrior = pNew; if( db->mallocFailed ) return 1; } @@ -103100,6 +103686,10 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ pNew->pHaving = 0; pNew->pOrderBy = 0; p->pPrior = 0; + p->pNext = 0; + p->selFlags &= ~SF_Compound; + assert( pNew->pPrior!=0 ); + pNew->pPrior->pNext = pNew; pNew->pLimit = 0; pNew->pOffset = 0; return WRC_Continue; @@ -103287,9 +103877,10 @@ static int withExpand( */ static void selectPopWith(Walker *pWalker, Select *p){ Parse *pParse = pWalker->pParse; - if( p->pWith ){ - assert( pParse->pWith==p->pWith ); - pParse->pWith = p->pWith->pOuter; + With *pWith = findRightmost(p)->pWith; + if( pWith!=0 ){ + assert( pParse->pWith==pWith ); + pParse->pWith = pWith->pOuter; } } #else @@ -103339,7 +103930,7 @@ static int selectExpander(Walker *pWalker, Select *p){ } pTabList = p->pSrc; pEList = p->pEList; - sqlite3WithPush(pParse, p->pWith, 0); + sqlite3WithPush(pParse, findRightmost(p)->pWith, 0); /* Make sure cursor numbers have been assigned to all entries in ** the FROM clause of the SELECT statement. @@ -103852,7 +104443,7 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ ** values to an OP_Copy. */ if( regHit ){ - addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); + addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); } sqlite3ExprCacheClear(pParse); for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ @@ -104011,42 +104602,24 @@ SQLITE_PRIVATE int sqlite3Select( p->selFlags |= SF_Aggregate; } i = -1; - }else if( pTabList->nSrc==1 && (p->selFlags & SF_Materialize)==0 - && OptimizationEnabled(db, SQLITE_SubqCoroutine) + }else if( pTabList->nSrc==1 + && OptimizationEnabled(db, SQLITE_SubqCoroutine) ){ /* Implement a co-routine that will return a single row of the result ** set on each invocation. */ - int addrTop; - int addrEof; + int addrTop = sqlite3VdbeCurrentAddr(v)+1; pItem->regReturn = ++pParse->nMem; - addrEof = ++pParse->nMem; - /* Before coding the OP_Goto to jump to the start of the main routine, - ** ensure that the jump to the verify-schema routine has already - ** been coded. Otherwise, the verify-schema would likely be coded as - ** part of the co-routine. If the main routine then accessed the - ** database before invoking the co-routine for the first time (for - ** example to initialize a LIMIT register from a sub-select), it would - ** be doing so without having verified the schema version and obtained - ** the required db locks. See ticket d6b36be38. */ - sqlite3CodeVerifySchema(pParse, -1); - sqlite3VdbeAddOp0(v, OP_Goto); - addrTop = sqlite3VdbeAddOp1(v, OP_OpenPseudo, pItem->iCursor); - sqlite3VdbeChangeP5(v, 1); - VdbeComment((v, "coroutine for %s", pItem->pTab->zName)); + sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); + VdbeComment((v, "%s", pItem->pTab->zName)); pItem->addrFillSub = addrTop; - sqlite3VdbeAddOp2(v, OP_Integer, 0, addrEof); - sqlite3VdbeChangeP5(v, 1); sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); sqlite3Select(pParse, pSub, &dest); pItem->pTab->nRowEst = (unsigned)pSub->nSelectRow; pItem->viaCoroutine = 1; - sqlite3VdbeChangeP2(v, addrTop, dest.iSdst); - sqlite3VdbeChangeP3(v, addrTop, dest.nSdst); - sqlite3VdbeAddOp2(v, OP_Integer, 1, addrEof); - sqlite3VdbeAddOp1(v, OP_Yield, pItem->regReturn); - VdbeComment((v, "end %s", pItem->pTab->zName)); + pItem->regResult = dest.iSdst; + sqlite3VdbeAddOp1(v, OP_EndCoroutine, pItem->regReturn); sqlite3VdbeJumpHere(v, addrTop-1); sqlite3ClearTempRegCache(pParse); }else{ @@ -104062,12 +104635,14 @@ SQLITE_PRIVATE int sqlite3Select( pItem->regReturn = ++pParse->nMem; topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); pItem->addrFillSub = topAddr+1; - VdbeNoopComment((v, "materialize %s", pItem->pTab->zName)); if( pItem->isCorrelated==0 ){ /* If the subquery is not correlated and if we are not inside of ** a trigger, then we only need to compute the value of the subquery ** once. */ - onceAddr = sqlite3CodeOnce(pParse); + onceAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); + VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); + }else{ + VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); } sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); @@ -104099,21 +104674,6 @@ SQLITE_PRIVATE int sqlite3Select( /* If there is are a sequence of queries, do the earlier ones first. */ if( p->pPrior ){ - if( p->pRightmost==0 ){ - Select *pLoop, *pRight = 0; - int cnt = 0; - int mxSelect; - for(pLoop=p; pLoop; pLoop=pLoop->pPrior, cnt++){ - pLoop->pRightmost = p; - pLoop->pNext = pRight; - pRight = pLoop; - } - mxSelect = db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT]; - if( mxSelect && cnt>mxSelect ){ - sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); - goto select_end; - } - } rc = multiSelect(pParse, p, pDest); explainSetInteger(pParse->iSelectId, iRestoreSelectId); return rc; @@ -104417,7 +104977,7 @@ SQLITE_PRIVATE int sqlite3Select( sortOut = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol); sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd); - VdbeComment((v, "GROUP BY sort")); + VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v); sAggInfo.useSortingIdx = 1; sqlite3ExprCacheClear(pParse); } @@ -104444,7 +105004,7 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); j1 = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp3(v, OP_Jump, j1+1, 0, j1+1); + sqlite3VdbeAddOp3(v, OP_Jump, j1+1, 0, j1+1); VdbeCoverage(v); /* Generate code that runs whenever the GROUP BY changes. ** Changes in the GROUP BY are detected by the previous code @@ -104458,7 +105018,7 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); VdbeComment((v, "output one row")); - sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); + sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); VdbeCoverage(v); VdbeComment((v, "check abort flag")); sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); VdbeComment((v, "reset accumulator")); @@ -104475,6 +105035,7 @@ SQLITE_PRIVATE int sqlite3Select( */ if( groupBySort ){ sqlite3VdbeAddOp2(v, OP_SorterNext, sAggInfo.sortingIdx, addrTopOfLoop); + VdbeCoverage(v); }else{ sqlite3WhereEnd(pWInfo); sqlite3VdbeChangeToNoop(v, addrSortingIdx); @@ -104502,7 +105063,7 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); sqlite3VdbeResolveLabel(v, addrOutputRow); addrOutputRow = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); + sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); VdbeCoverage(v); VdbeComment((v, "Groupby result generator entry point")); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); finalizeAggFunctions(pParse, &sAggInfo); @@ -104775,10 +105336,6 @@ SQLITE_PRIVATE void sqlite3ExplainSelect(Vdbe *pVdbe, Select *p){ sqlite3ExplainPrintf(pVdbe, "(null-select)"); return; } - while( p->pPrior ){ - p->pPrior->pNext = p; - p = p->pPrior; - } sqlite3ExplainPush(pVdbe); while( p ){ explainOneSelect(pVdbe, p); @@ -105563,6 +106120,7 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ assert( pTable!=0 ); if( (v = sqlite3GetVdbe(pParse))!=0 ){ int base; + static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList dropTrigger[] = { { OP_Rewind, 0, ADDR(9), 0}, { OP_String8, 0, 1, 0}, /* 1 */ @@ -105577,7 +106135,7 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ sqlite3BeginWriteOperation(pParse, 0, iDb); sqlite3OpenMasterTable(pParse, iDb); - base = sqlite3VdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger); + base = sqlite3VdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger, iLn); sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, P4_TRANSIENT); sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC); sqlite3ChangeCookie(pParse, iDb); @@ -105723,15 +106281,7 @@ static int codeTriggerProgram( ** INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy */ pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf; - - /* Clear the cookieGoto flag. When coding triggers, the cookieGoto - ** variable is used as a flag to indicate to sqlite3ExprCodeConstants() - ** that it is not safe to refactor constants (this happens after the - ** start of the first loop in the SQL statement is coded - at that - ** point code may be conditionally executed, so it is no longer safe to - ** initialize constant register values). */ - assert( pParse->cookieGoto==0 || pParse->cookieGoto==-1 ); - pParse->cookieGoto = 0; + assert( pParse->okConstFactor==0 ); switch( pStep->op ){ case TK_UPDATE: { @@ -106520,7 +107070,7 @@ SQLITE_PRIVATE void sqlite3Update( regKey = iPk; }else{ sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, - sqlite3IndexAffinityStr(v, pPk), P4_TRANSIENT); + sqlite3IndexAffinityStr(v, pPk), nPk); sqlite3VdbeAddOp2(v, OP_IdxInsert, iEph, regKey); } sqlite3WhereEnd(pWInfo); @@ -106564,18 +107114,23 @@ SQLITE_PRIVATE void sqlite3Update( if( aToOpen[iDataCur-iBaseCur] ){ assert( pPk!=0 ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey); + VdbeCoverageNeverTaken(v); } labelContinue = labelBreak; sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); + VdbeCoverage(v); }else if( pPk ){ labelContinue = sqlite3VdbeMakeLabel(v); - sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); addrTop = sqlite3VdbeAddOp2(v, OP_RowKey, iEph, regKey); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); + VdbeCoverage(v); }else{ labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, labelBreak, regOldRowid); + VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); + VdbeCoverage(v); } /* If the record number will change, set register regNewRowid to @@ -106585,7 +107140,7 @@ SQLITE_PRIVATE void sqlite3Update( assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid ); if( chngRowid ){ sqlite3ExprCode(pParse, pRowidExpr, regNewRowid); - sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v); } /* Compute the old pre-UPDATE content of the row being changed, if that @@ -106654,8 +107209,7 @@ SQLITE_PRIVATE void sqlite3Update( ** verified. One could argue that this is wrong. */ if( tmask&TRIGGER_BEFORE ){ - sqlite3VdbeAddOp2(v, OP_Affinity, regNew, pTab->nCol); - sqlite3TableAffinityStr(v, pTab); + sqlite3TableAffinity(v, pTab, regNew); sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); @@ -106667,8 +107221,10 @@ SQLITE_PRIVATE void sqlite3Update( */ if( pPk ){ sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue,regKey,nKey); + VdbeCoverage(v); }else{ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); + VdbeCoverage(v); } /* If it did not delete it, the row-trigger may still have modified @@ -106704,6 +107260,7 @@ SQLITE_PRIVATE void sqlite3Update( }else{ j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); } + VdbeCoverageNeverTaken(v); } sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx); @@ -106747,7 +107304,7 @@ SQLITE_PRIVATE void sqlite3Update( /* Nothing to do at end-of-loop for a single-pass */ }else if( pPk ){ sqlite3VdbeResolveLabel(v, labelContinue); - sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); + sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v); }else{ sqlite3VdbeAddOp2(v, OP_Goto, 0, labelContinue); } @@ -106876,7 +107433,7 @@ static void updateVirtualTable( /* Generate code to scan the ephemeral table and call VUpdate. */ iReg = ++pParse->nMem; pParse->nMem += pTab->nCol+1; - addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0); + addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, ephemTab, 0, iReg); sqlite3VdbeAddOp3(v, OP_Column, ephemTab, (pRowid?1:0), iReg+1); for(i=0; inCol; i++){ @@ -106886,7 +107443,7 @@ static void updateVirtualTable( sqlite3VdbeAddOp4(v, OP_VUpdate, 0, pTab->nCol+2, iReg, pVTab, P4_VTAB); sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); sqlite3MayAbort(pParse); - sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); + sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr); sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0); @@ -108458,7 +109015,7 @@ struct WhereLevel { int addrFirst; /* First instruction of interior of the loop */ int addrBody; /* Beginning of the body of this loop */ u8 iFrom; /* Which entry in the FROM clause */ - u8 op, p5; /* Opcode and P5 of the opcode that ends the loop */ + u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ int p1, p2; /* Operands of the opcode used to ends the loop */ union { /* Information that depends on pWLoop->wsFlags */ struct { @@ -108845,6 +109402,7 @@ struct WhereInfo { #define WHERE_MULTI_OR 0x00002000 /* OR using multiple indices */ #define WHERE_AUTO_INDEX 0x00004000 /* Uses an ephemeral index */ #define WHERE_SKIPSCAN 0x00008000 /* Uses the skip-scan algorithm */ +#define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/ /************** End of whereInt.h ********************************************/ /************** Continuing where we left off in where.c **********************/ @@ -110431,7 +110989,7 @@ static void constructAutomaticIndex( ** transient index on 2nd and subsequent iterations of the loop. */ v = pParse->pVdbe; assert( v!=0 ); - addrInit = sqlite3CodeOnce(pParse); + addrInit = sqlite3CodeOnce(pParse); VdbeCoverage(v); /* Count the number of columns that will be added to the index ** and used to match WHERE clause constraints */ @@ -110538,12 +111096,12 @@ static void constructAutomaticIndex( VdbeComment((v, "for %s", pTable->zName)); /* Fill the automatic index with content */ - addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); regRecord = sqlite3GetTempReg(pParse); sqlite3GenerateIndexKey(pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0); sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); - sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); sqlite3VdbeJumpHere(v, addrTop); sqlite3ReleaseTempReg(pParse, regRecord); @@ -110743,7 +111301,7 @@ static void whereKeyStats( assert( pRec->nField>0 && iColnSampleCol ); do{ iTest = (iMin+i)/2; - res = sqlite3VdbeRecordCompare(aSample[iTest].n, aSample[iTest].p, pRec); + res = sqlite3VdbeRecordCompare(aSample[iTest].n, aSample[iTest].p, pRec, 0); if( res<0 ){ iMin = iTest+1; }else{ @@ -110758,16 +111316,16 @@ static void whereKeyStats( if( res==0 ){ /* If (res==0) is true, then sample $i must be equal to pRec */ assert( inSample ); - assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) + assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec, 0) || pParse->db->mallocFailed ); }else{ /* Otherwise, pRec must be smaller than sample $i and larger than ** sample ($i-1). */ assert( i==pIdx->nSample - || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 + || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec, 0)>0 || pParse->db->mallocFailed ); assert( i==0 - || sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 + || sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec, 0)<0 || pParse->db->mallocFailed ); } #endif /* ifdef SQLITE_DEBUG */ @@ -111219,6 +111777,8 @@ static int codeEqualityTerm( } iTab = pX->iTable; sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); + VdbeCoverageIf(v, bRev); + VdbeCoverageIf(v, !bRev); assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); pLoop->wsFlags |= WHERE_IN_ABLE; if( pLevel->u.in.nIn==0 ){ @@ -111238,7 +111798,7 @@ static int codeEqualityTerm( pIn->addrInTop = sqlite3VdbeAddOp3(v, OP_Column, iTab, 0, iReg); } pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen; - sqlite3VdbeAddOp1(v, OP_IsNull, iReg); + sqlite3VdbeAddOp1(v, OP_IsNull, iReg); VdbeCoverage(v); }else{ pLevel->u.in.nIn = 0; } @@ -111333,10 +111893,14 @@ static int codeAllEqualityTerms( if( nSkip ){ int iIdxCur = pLevel->iIdxCur; sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); j = sqlite3VdbeAddOp0(v, OP_Goto); - pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLt:OP_SeekGt), + pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), iIdxCur, 0, regBase, nSkip); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); sqlite3VdbeJumpHere(v, j); for(j=0; jeOperator & WO_IN ); if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){ Expr *pRight = pTerm->pExpr->pRight; - sqlite3ExprCodeIsNullJump(v, pRight, regBase+j, pLevel->addrBrk); + if( sqlite3ExprCanBeNull(pRight) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); + VdbeCoverage(v); + } if( zAff ){ if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_NONE ){ zAff[j] = SQLITE_AFF_NONE; @@ -111615,10 +112182,10 @@ static Bitmask codeOneLoopStart( /* Special case of a FROM clause subquery implemented as a co-routine */ if( pTabItem->viaCoroutine ){ int regYield = pTabItem->regReturn; - sqlite3VdbeAddOp2(v, OP_Integer, pTabItem->addrFillSub-1, regYield); - pLevel->p2 = sqlite3VdbeAddOp1(v, OP_Yield, regYield); - VdbeComment((v, "next row of co-routine %s", pTabItem->pTab->zName)); - sqlite3VdbeAddOp2(v, OP_If, regYield+1, addrBrk); + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); + VdbeCoverage(v); + VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); pLevel->op = OP_Goto; }else @@ -111650,6 +112217,7 @@ static Bitmask codeOneLoopStart( sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, pLoop->u.vtab.idxStr, pLoop->u.vtab.needFree ? P4_MPRINTF : P4_STATIC); + VdbeCoverage(v); pLoop->u.vtab.needFree = 0; for(j=0; ju.vtab.omitMask>>j)&1 ){ @@ -111673,16 +112241,18 @@ static Bitmask codeOneLoopStart( ** construct. */ assert( pLoop->u.btree.nEq==1 ); - iReleaseReg = sqlite3GetTempReg(pParse); pTerm = pLoop->aLTerm[0]; assert( pTerm!=0 ); assert( pTerm->pExpr!=0 ); assert( omitTable==0 ); testcase( pTerm->wtFlags & TERM_VIRTUAL ); + iReleaseReg = ++pParse->nMem; iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); + if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); addrNxt = pLevel->addrNxt; - sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt); + sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addrNxt, iRowidReg); + VdbeCoverage(v); sqlite3ExprCacheAffinityChange(pParse, iRowidReg, 1); sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); VdbeComment((v, "pk")); @@ -111716,10 +112286,10 @@ static Bitmask codeOneLoopStart( ** seek opcodes. It depends on a particular ordering of TK_xx */ const u8 aMoveOp[] = { - /* TK_GT */ OP_SeekGt, - /* TK_LE */ OP_SeekLe, - /* TK_LT */ OP_SeekLt, - /* TK_GE */ OP_SeekGe + /* TK_GT */ OP_SeekGT, + /* TK_LE */ OP_SeekLE, + /* TK_LT */ OP_SeekLT, + /* TK_GE */ OP_SeekGE }; assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ @@ -111733,11 +112303,17 @@ static Bitmask codeOneLoopStart( r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); sqlite3VdbeAddOp3(v, aMoveOp[pX->op-TK_GT], iCur, addrBrk, r1); VdbeComment((v, "pk")); + VdbeCoverageIf(v, pX->op==TK_GT); + VdbeCoverageIf(v, pX->op==TK_LE); + VdbeCoverageIf(v, pX->op==TK_LT); + VdbeCoverageIf(v, pX->op==TK_GE); sqlite3ExprCacheAffinityChange(pParse, r1, 1); sqlite3ReleaseTempReg(pParse, rTemp); disableTerm(pLevel, pStart); }else{ sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); } if( pEnd ){ Expr *pX; @@ -111761,10 +112337,14 @@ static Bitmask codeOneLoopStart( pLevel->p2 = start; assert( pLevel->p5==0 ); if( testOp!=OP_Noop ){ - iRowidReg = iReleaseReg = sqlite3GetTempReg(pParse); + iRowidReg = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); + VdbeCoverageIf(v, testOp==OP_Le); + VdbeCoverageIf(v, testOp==OP_Lt); + VdbeCoverageIf(v, testOp==OP_Ge); + VdbeCoverageIf(v, testOp==OP_Gt); sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); } }else if( pLoop->wsFlags & WHERE_INDEXED ){ @@ -111804,20 +112384,19 @@ static Bitmask codeOneLoopStart( 0, OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ OP_Last, /* 3: (!start_constraints && startEq && bRev) */ - OP_SeekGt, /* 4: (start_constraints && !startEq && !bRev) */ - OP_SeekLt, /* 5: (start_constraints && !startEq && bRev) */ - OP_SeekGe, /* 6: (start_constraints && startEq && !bRev) */ - OP_SeekLe /* 7: (start_constraints && startEq && bRev) */ + OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ + OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ + OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ + OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ }; static const u8 aEndOp[] = { - OP_Noop, /* 0: (!end_constraints) */ - OP_IdxGE, /* 1: (end_constraints && !bRev) */ - OP_IdxLT /* 2: (end_constraints && bRev) */ + OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ + OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ + OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ + OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ }; u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ - int isMinQuery = 0; /* If this is an optimized SELECT min(x).. */ int regBase; /* Base register holding constraint values */ - int r1; /* Temp register */ WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ int startEq; /* True if range start uses ==, >= or <= */ @@ -111830,6 +112409,8 @@ static Bitmask codeOneLoopStart( int op; /* Instruction opcode */ char *zStartAff; /* Affinity for start of range constraint */ char cEndAff = 0; /* Affinity for end of range constraint */ + u8 bSeekPastNull = 0; /* True to seek past initial nulls */ + u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ pIdx = pLoop->u.btree.pIndex; iIdxCur = pLevel->iIdxCur; @@ -111848,7 +112429,7 @@ static Bitmask codeOneLoopStart( && (pIdx->nKeyCol>nEq) ){ assert( pLoop->u.btree.nSkip==0 ); - isMinQuery = 1; + bSeekPastNull = 1; nExtraReg = 1; } @@ -111863,7 +112444,14 @@ static Bitmask codeOneLoopStart( if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ pRangeEnd = pLoop->aLTerm[j++]; nExtraReg = 1; + if( pRangeStart==0 + && (j = pIdx->aiColumn[nEq])>=0 + && pIdx->pTable->aCol[j].notNull==0 + ){ + bSeekPastNull = 1; + } } + assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); /* Generate code to evaluate all constraint terms using == or IN ** and store the values of those terms in an array of registers @@ -111882,6 +112470,7 @@ static Bitmask codeOneLoopStart( || (bRev && pIdx->nKeyCol==nEq) ){ SWAP(WhereTerm *, pRangeEnd, pRangeStart); + SWAP(u8, bSeekPastNull, bStopAtNull); } testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); @@ -111897,8 +112486,11 @@ static Bitmask codeOneLoopStart( if( pRangeStart ){ Expr *pRight = pRangeStart->pExpr->pRight; sqlite3ExprCode(pParse, pRight, regBase+nEq); - if( (pRangeStart->wtFlags & TERM_VNULL)==0 ){ - sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt); + if( (pRangeStart->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); } if( zStartAff ){ if( sqlite3CompareAffinity(pRight, zStartAff[nEq])==SQLITE_AFF_NONE){ @@ -111913,22 +112505,23 @@ static Bitmask codeOneLoopStart( } nConstraint++; testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); - }else if( isMinQuery ){ + }else if( bSeekPastNull ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); nConstraint++; startEq = 0; start_constraints = 1; } - codeApplyAffinity(pParse, regBase, nConstraint, zStartAff); + codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; assert( op!=0 ); - testcase( op==OP_Rewind ); - testcase( op==OP_Last ); - testcase( op==OP_SeekGt ); - testcase( op==OP_SeekGe ); - testcase( op==OP_SeekLe ); - testcase( op==OP_SeekLt ); sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); /* Load the value for the inequality constraint at the end of the ** range (if any). @@ -111938,8 +112531,11 @@ static Bitmask codeOneLoopStart( Expr *pRight = pRangeEnd->pExpr->pRight; sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); sqlite3ExprCode(pParse, pRight, regBase+nEq); - if( (pRangeEnd->wtFlags & TERM_VNULL)==0 ){ - sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt); + if( (pRangeEnd->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); } if( sqlite3CompareAffinity(pRight, cEndAff)!=SQLITE_AFF_NONE && !sqlite3ExprNeedsNoAffinityChange(pRight, cEndAff) @@ -111948,6 +112544,10 @@ static Bitmask codeOneLoopStart( } nConstraint++; testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); + }else if( bStopAtNull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + endEq = 0; + nConstraint++; } sqlite3DbFree(db, zStartAff); @@ -111955,40 +112555,22 @@ static Bitmask codeOneLoopStart( pLevel->p2 = sqlite3VdbeCurrentAddr(v); /* Check if the index cursor is past the end of the range. */ - op = aEndOp[(pRangeEnd || nEq) * (1 + bRev)]; - testcase( op==OP_Noop ); - testcase( op==OP_IdxGE ); - testcase( op==OP_IdxLT ); - if( op!=OP_Noop ){ + if( nConstraint ){ + op = aEndOp[bRev*2 + endEq]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - sqlite3VdbeChangeP5(v, endEq!=bRev ?1:0); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); } - /* If there are inequality constraints, check that the value - ** of the table column that the inequality contrains is not NULL. - ** If it is, jump to the next iteration of the loop. - */ - r1 = sqlite3GetTempReg(pParse); - testcase( pLoop->wsFlags & WHERE_BTM_LIMIT ); - testcase( pLoop->wsFlags & WHERE_TOP_LIMIT ); - if( (pLoop->wsFlags & (WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 - && (j = pIdx->aiColumn[nEq])>=0 - && pIdx->pTable->aCol[j].notNull==0 - && (nEq || (pLoop->wsFlags & WHERE_BTM_LIMIT)==0) - ){ - sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, nEq, r1); - VdbeComment((v, "%s", pIdx->pTable->aCol[j].zName)); - sqlite3VdbeAddOp2(v, OP_IsNull, r1, addrCont); - } - sqlite3ReleaseTempReg(pParse, r1); - /* Seek the table cursor, if required */ disableTerm(pLevel, pRangeStart); disableTerm(pLevel, pRangeEnd); if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ - iRowidReg = iReleaseReg = sqlite3GetTempReg(pParse); + iRowidReg = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); sqlite3VdbeAddOp2(v, OP_Seek, iCur, iRowidReg); /* Deferred seek */ @@ -112000,7 +112582,7 @@ static Bitmask codeOneLoopStart( sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); } sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, - iRowidReg, pPk->nKeyCol); + iRowidReg, pPk->nKeyCol); VdbeCoverage(v); } /* Record the instruction used to terminate the loop. Disable @@ -112014,6 +112596,8 @@ static Bitmask codeOneLoopStart( pLevel->op = OP_Next; } pLevel->p1 = iIdxCur; + assert( (WHERE_UNQ_WANTED>>16)==1 ); + pLevel->p3 = (pLoop->wsFlags>>16)&1; if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; }else{ @@ -112182,6 +112766,7 @@ static Bitmask codeOneLoopStart( regRowid, 0); sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, sqlite3VdbeCurrentAddr(v)+2, r, iSet); + VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); @@ -112250,6 +112835,8 @@ static Bitmask codeOneLoopStart( pLevel->op = aStep[bRev]; pLevel->p1 = iCur; pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; } } @@ -112331,7 +112918,6 @@ static Bitmask codeOneLoopStart( pTerm->wtFlags |= TERM_CODED; } } - sqlite3ReleaseTempReg(pParse, iReleaseReg); return pLevel->notReady; } @@ -112776,7 +113362,10 @@ static int whereLoopAddBtreeIndex( pNew->aLTerm[pNew->nLTerm++] = 0; pNew->wsFlags |= WHERE_SKIPSCAN; nIter = sqlite3LogEst(pProbe->aiRowEst[0]/pProbe->aiRowEst[saved_nEq+1]); + pNew->rRun = rLogSize + nIter; + pNew->nOut += nIter; whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nIter); + pNew->nOut = saved_nOut; } for(; rc==SQLITE_OK && pTerm!=0; pTerm = whereScanNext(&scan)){ int nIn = 0; @@ -112818,12 +113407,13 @@ static int whereLoopAddBtreeIndex( || nInMul==0 ); pNew->wsFlags |= WHERE_COLUMN_EQ; - if( iCol<0 - || (pProbe->onError!=OE_None && nInMul==0 - && pNew->u.btree.nEq==pProbe->nKeyCol-1) - ){ + if( iCol<0 || (nInMul==0 && pNew->u.btree.nEq==pProbe->nKeyCol-1)){ assert( (pNew->wsFlags & WHERE_COLUMN_IN)==0 || iCol<0 ); - pNew->wsFlags |= WHERE_ONEROW; + if( iCol>=0 && pProbe->onError==OE_None ){ + pNew->wsFlags |= WHERE_UNQ_WANTED; + }else{ + pNew->wsFlags |= WHERE_ONEROW; + } } pNew->u.btree.nEq++; pNew->nOut = nRowEst + nInMul; @@ -113702,9 +114292,12 @@ static int wherePathSatisfiesOrderBy( orderDistinctMask |= pLoop->maskSelf; for(i=0; ia[i].pExpr; - if( (exprTableUsage(&pWInfo->sMaskSet, p)&~orderDistinctMask)==0 ){ + mTerm = exprTableUsage(&pWInfo->sMaskSet,p); + if( mTerm==0 && !sqlite3ExprIsConstant(p) ) continue; + if( (mTerm&~orderDistinctMask)==0 ){ obSat |= MASKBIT(i); } } @@ -114266,7 +114859,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( initMaskSet(pMaskSet); whereClauseInit(&pWInfo->sWC, pWInfo); whereSplit(&pWInfo->sWC, pWhere, TK_AND); - sqlite3CodeVerifySchema(pParse, -1); /* Insert the cookie verifier Goto */ /* Special case: a WHERE clause that is constant. Evaluate the ** expression and either jump over all of the code or fall thru. @@ -114328,22 +114920,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( goto whereBeginError; } - /* If the ORDER BY (or GROUP BY) clause contains references to general - ** expressions, then we won't be able to satisfy it using indices, so - ** go ahead and disable it now. - */ - if( pOrderBy && (wctrlFlags & WHERE_WANT_DISTINCT)!=0 ){ - for(ii=0; iinExpr; ii++){ - Expr *pExpr = sqlite3ExprSkipCollate(pOrderBy->a[ii].pExpr); - if( pExpr->op!=TK_COLUMN ){ - pWInfo->pOrderBy = pOrderBy = 0; - break; - }else if( pExpr->iColumn<0 ){ - break; - } - } - } - if( wctrlFlags & WHERE_WANT_DISTINCT ){ if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ /* The DISTINCT marking is pointless. Ignore it. */ @@ -114555,7 +115131,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( sqlite3VdbeSetP4KeyInfo(pParse, pIx); VdbeComment((v, "%s", pIx->zName)); } - sqlite3CodeVerifySchema(pParse, iDb); + if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); notReady &= ~getMask(&pWInfo->sMaskSet, pTabItem->iCursor); } pWInfo->iTop = sqlite3VdbeCurrentAddr(v); @@ -114617,8 +115193,12 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ pLoop = pLevel->pWLoop; sqlite3VdbeResolveLabel(v, pLevel->addrCont); if( pLevel->op!=OP_Noop ){ - sqlite3VdbeAddOp2(v, pLevel->op, pLevel->p1, pLevel->p2); + sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); sqlite3VdbeChangeP5(v, pLevel->p5); + VdbeCoverage(v); + VdbeCoverageIf(v, pLevel->op==OP_Next); + VdbeCoverageIf(v, pLevel->op==OP_Prev); + VdbeCoverageIf(v, pLevel->op==OP_VNext); } if( pLoop->wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){ struct InLoop *pIn; @@ -114627,6 +115207,9 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ sqlite3VdbeJumpHere(v, pIn->addrInTop+1); sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); + VdbeCoverage(v); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_PrevIfOpen); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_NextIfOpen); sqlite3VdbeJumpHere(v, pIn->addrInTop-1); } sqlite3DbFree(db, pLevel->u.in.aInLoop); @@ -114639,7 +115222,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ sqlite3VdbeJumpHere(v, pLevel->addrSkip-2); } if( pLevel->iLeftJoin ){ - addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); + addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v); assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || (pLoop->wsFlags & WHERE_INDEXED)!=0 ); if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 ){ @@ -114666,12 +115249,38 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ assert( pWInfo->nLevel<=pTabList->nSrc ); for(i=0, pLevel=pWInfo->a; inLevel; i++, pLevel++){ + int k, last; + VdbeOp *pOp; Index *pIdx = 0; struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom]; Table *pTab = pTabItem->pTab; assert( pTab!=0 ); pLoop = pLevel->pWLoop; + /* For a co-routine, change all OP_Column references to the table of + ** the co-routine into OP_SCopy of result contained in a register. + ** OP_Rowid becomes OP_Null. + */ + if( pTabItem->viaCoroutine && !db->mallocFailed ){ + last = sqlite3VdbeCurrentAddr(v); + k = pLevel->addrBody; + pOp = sqlite3VdbeGetOp(v, k); + for(; kp1!=pLevel->iTabCur ) continue; + if( pOp->opcode==OP_Column ){ + pOp->opcode = OP_SCopy; + pOp->p1 = pOp->p2 + pTabItem->regResult; + pOp->p2 = pOp->p3; + pOp->p3 = 0; + }else if( pOp->opcode==OP_Rowid ){ + pOp->opcode = OP_Null; + pOp->p1 = 0; + pOp->p3 = 0; + } + } + continue; + } + /* Close all of the cursors that were opened by sqlite3WhereBegin. ** Except, do not close cursors that will be reused by the OR optimization ** (WHERE_OMIT_OPEN_CLOSE). And do not close the OP_OpenWrite cursors @@ -114710,9 +115319,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ pIdx = pLevel->u.pCovidx; } if( pIdx && !db->mallocFailed ){ - int k, last; - VdbeOp *pOp; - last = sqlite3VdbeCurrentAddr(v); k = pLevel->addrBody; pOp = sqlite3VdbeGetOp(v, k); @@ -117126,13 +117732,26 @@ static void yy_reduce( } break; case 112: /* select ::= with selectnowith */ -{ - if( yymsp[0].minor.yy3 ){ - yymsp[0].minor.yy3->pWith = yymsp[-1].minor.yy59; +{ + Select *p = yymsp[0].minor.yy3, *pNext, *pLoop; + if( p ){ + int cnt = 0, mxSelect; + p->pWith = yymsp[-1].minor.yy59; + if( p->pPrior ){ + pNext = 0; + for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ + pLoop->pNext = pNext; + pLoop->selFlags |= SF_Compound; + } + mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT]; + if( mxSelect && cnt>mxSelect ){ + sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); + } + } }else{ sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy59); } - yygotominor.yy3 = yymsp[0].minor.yy3; + yygotominor.yy3 = p; } break; case 113: /* selectnowith ::= oneselect */ @@ -117141,14 +117760,22 @@ static void yy_reduce( break; case 114: /* selectnowith ::= selectnowith multiselect_op oneselect */ { - if( yymsp[0].minor.yy3 ){ - yymsp[0].minor.yy3->op = (u8)yymsp[-1].minor.yy328; - yymsp[0].minor.yy3->pPrior = yymsp[-2].minor.yy3; + Select *pRhs = yymsp[0].minor.yy3; + if( pRhs && pRhs->pPrior ){ + SrcList *pFrom; + Token x; + x.n = 0; + pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); + pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0); + } + if( pRhs ){ + pRhs->op = (u8)yymsp[-1].minor.yy328; + pRhs->pPrior = yymsp[-2].minor.yy3; if( yymsp[-1].minor.yy328!=TK_ALL ) pParse->hasCompound = 1; }else{ sqlite3SelectDelete(pParse->db, yymsp[-2].minor.yy3); } - yygotominor.yy3 = yymsp[0].minor.yy3; + yygotominor.yy3 = pRhs; } break; case 116: /* multiselect_op ::= UNION ALL */ @@ -122716,6 +123343,21 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } + + /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr); + ** + ** Set the VDBE coverage callback function to xCallback with context + ** pointer ptr. + */ + case SQLITE_TESTCTRL_VDBE_COVERAGE: { +#ifdef SQLITE_VDBE_COVERAGE + typedef void (*branch_callback)(void*,int,u8,u8); + sqlite3GlobalConfig.xVdbeBranch = va_arg(ap,branch_callback); + sqlite3GlobalConfig.pVdbeBranchArg = va_arg(ap,void*); +#endif + break; + } + } va_end(ap); #endif /* SQLITE_OMIT_BUILTIN_TEST */ diff --git a/TMessagesProj/jni/sqlite3.h b/TMessagesProj/jni/sqlite3.h index 6cf5977b..1f19ada4 100644 --- a/TMessagesProj/jni/sqlite3.h +++ b/TMessagesProj/jni/sqlite3.h @@ -107,9 +107,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.8.3.1" -#define SQLITE_VERSION_NUMBER 3008003 -#define SQLITE_SOURCE_ID "2014-02-11 14:52:19 ea3317a4803d71d88183b29f1d3086f46d68a00e" +#define SQLITE_VERSION "3.8.4.1" +#define SQLITE_VERSION_NUMBER 3008004 +#define SQLITE_SOURCE_ID "2014-03-11 15:27:36 018d317b1257ce68a92908b05c9c7cf1494050d0" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -6122,7 +6122,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 #define SQLITE_TESTCTRL_NEVER_CORRUPT 20 -#define SQLITE_TESTCTRL_LAST 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_LAST 21 /* ** CAPI3REF: SQLite Runtime Status diff --git a/TMessagesProj/jni/sqlite3ext.h b/TMessagesProj/jni/sqlite3ext.h deleted file mode 100644 index ecf93f62..00000000 --- a/TMessagesProj/jni/sqlite3ext.h +++ /dev/null @@ -1,487 +0,0 @@ -/* -** 2006 June 7 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the SQLite interface for use by -** shared libraries that want to be imported as extensions into -** an SQLite instance. Shared libraries that intend to be loaded -** as extensions by SQLite should #include this file instead of -** sqlite3.h. -*/ -#ifndef _SQLITE3EXT_H_ -#define _SQLITE3EXT_H_ -#include "sqlite3.h" - -typedef struct sqlite3_api_routines sqlite3_api_routines; - -/* -** The following structure holds pointers to all of the SQLite API -** routines. -** -** WARNING: In order to maintain backwards compatibility, add new -** interfaces to the end of this structure only. If you insert new -** interfaces in the middle of this structure, then older different -** versions of SQLite will not be able to load each others' shared -** libraries! -*/ -struct sqlite3_api_routines { - void * (*aggregate_context)(sqlite3_context*,int nBytes); - int (*aggregate_count)(sqlite3_context*); - int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); - int (*bind_double)(sqlite3_stmt*,int,double); - int (*bind_int)(sqlite3_stmt*,int,int); - int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); - int (*bind_null)(sqlite3_stmt*,int); - int (*bind_parameter_count)(sqlite3_stmt*); - int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); - const char * (*bind_parameter_name)(sqlite3_stmt*,int); - int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); - int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); - int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); - int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); - int (*busy_timeout)(sqlite3*,int ms); - int (*changes)(sqlite3*); - int (*close)(sqlite3*); - int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*, - int eTextRep,const char*)); - int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*, - int eTextRep,const void*)); - const void * (*column_blob)(sqlite3_stmt*,int iCol); - int (*column_bytes)(sqlite3_stmt*,int iCol); - int (*column_bytes16)(sqlite3_stmt*,int iCol); - int (*column_count)(sqlite3_stmt*pStmt); - const char * (*column_database_name)(sqlite3_stmt*,int); - const void * (*column_database_name16)(sqlite3_stmt*,int); - const char * (*column_decltype)(sqlite3_stmt*,int i); - const void * (*column_decltype16)(sqlite3_stmt*,int); - double (*column_double)(sqlite3_stmt*,int iCol); - int (*column_int)(sqlite3_stmt*,int iCol); - sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); - const char * (*column_name)(sqlite3_stmt*,int); - const void * (*column_name16)(sqlite3_stmt*,int); - const char * (*column_origin_name)(sqlite3_stmt*,int); - const void * (*column_origin_name16)(sqlite3_stmt*,int); - const char * (*column_table_name)(sqlite3_stmt*,int); - const void * (*column_table_name16)(sqlite3_stmt*,int); - const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); - const void * (*column_text16)(sqlite3_stmt*,int iCol); - int (*column_type)(sqlite3_stmt*,int iCol); - sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); - void * (*commit_hook)(sqlite3*,int(*)(void*),void*); - int (*complete)(const char*sql); - int (*complete16)(const void*sql); - int (*create_collation)(sqlite3*,const char*,int,void*, - int(*)(void*,int,const void*,int,const void*)); - int (*create_collation16)(sqlite3*,const void*,int,void*, - int(*)(void*,int,const void*,int,const void*)); - int (*create_function)(sqlite3*,const char*,int,int,void*, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*)); - int (*create_function16)(sqlite3*,const void*,int,int,void*, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*)); - int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); - int (*data_count)(sqlite3_stmt*pStmt); - sqlite3 * (*db_handle)(sqlite3_stmt*); - int (*declare_vtab)(sqlite3*,const char*); - int (*enable_shared_cache)(int); - int (*errcode)(sqlite3*db); - const char * (*errmsg)(sqlite3*); - const void * (*errmsg16)(sqlite3*); - int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); - int (*expired)(sqlite3_stmt*); - int (*finalize)(sqlite3_stmt*pStmt); - void (*free)(void*); - void (*free_table)(char**result); - int (*get_autocommit)(sqlite3*); - void * (*get_auxdata)(sqlite3_context*,int); - int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); - int (*global_recover)(void); - void (*interruptx)(sqlite3*); - sqlite_int64 (*last_insert_rowid)(sqlite3*); - const char * (*libversion)(void); - int (*libversion_number)(void); - void *(*malloc)(int); - char * (*mprintf)(const char*,...); - int (*open)(const char*,sqlite3**); - int (*open16)(const void*,sqlite3**); - int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); - int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); - void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); - void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); - void *(*realloc)(void*,int); - int (*reset)(sqlite3_stmt*pStmt); - void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_double)(sqlite3_context*,double); - void (*result_error)(sqlite3_context*,const char*,int); - void (*result_error16)(sqlite3_context*,const void*,int); - void (*result_int)(sqlite3_context*,int); - void (*result_int64)(sqlite3_context*,sqlite_int64); - void (*result_null)(sqlite3_context*); - void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); - void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_value)(sqlite3_context*,sqlite3_value*); - void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); - int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, - const char*,const char*),void*); - void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); - char * (*snprintf)(int,char*,const char*,...); - int (*step)(sqlite3_stmt*); - int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, - char const**,char const**,int*,int*,int*); - void (*thread_cleanup)(void); - int (*total_changes)(sqlite3*); - void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); - int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); - void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*, - sqlite_int64),void*); - void * (*user_data)(sqlite3_context*); - const void * (*value_blob)(sqlite3_value*); - int (*value_bytes)(sqlite3_value*); - int (*value_bytes16)(sqlite3_value*); - double (*value_double)(sqlite3_value*); - int (*value_int)(sqlite3_value*); - sqlite_int64 (*value_int64)(sqlite3_value*); - int (*value_numeric_type)(sqlite3_value*); - const unsigned char * (*value_text)(sqlite3_value*); - const void * (*value_text16)(sqlite3_value*); - const void * (*value_text16be)(sqlite3_value*); - const void * (*value_text16le)(sqlite3_value*); - int (*value_type)(sqlite3_value*); - char *(*vmprintf)(const char*,va_list); - /* Added ??? */ - int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); - /* Added by 3.3.13 */ - int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); - int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); - int (*clear_bindings)(sqlite3_stmt*); - /* Added by 3.4.1 */ - int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, - void (*xDestroy)(void *)); - /* Added by 3.5.0 */ - int (*bind_zeroblob)(sqlite3_stmt*,int,int); - int (*blob_bytes)(sqlite3_blob*); - int (*blob_close)(sqlite3_blob*); - int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64, - int,sqlite3_blob**); - int (*blob_read)(sqlite3_blob*,void*,int,int); - int (*blob_write)(sqlite3_blob*,const void*,int,int); - int (*create_collation_v2)(sqlite3*,const char*,int,void*, - int(*)(void*,int,const void*,int,const void*), - void(*)(void*)); - int (*file_control)(sqlite3*,const char*,int,void*); - sqlite3_int64 (*memory_highwater)(int); - sqlite3_int64 (*memory_used)(void); - sqlite3_mutex *(*mutex_alloc)(int); - void (*mutex_enter)(sqlite3_mutex*); - void (*mutex_free)(sqlite3_mutex*); - void (*mutex_leave)(sqlite3_mutex*); - int (*mutex_try)(sqlite3_mutex*); - int (*open_v2)(const char*,sqlite3**,int,const char*); - int (*release_memory)(int); - void (*result_error_nomem)(sqlite3_context*); - void (*result_error_toobig)(sqlite3_context*); - int (*sleep)(int); - void (*soft_heap_limit)(int); - sqlite3_vfs *(*vfs_find)(const char*); - int (*vfs_register)(sqlite3_vfs*,int); - int (*vfs_unregister)(sqlite3_vfs*); - int (*xthreadsafe)(void); - void (*result_zeroblob)(sqlite3_context*,int); - void (*result_error_code)(sqlite3_context*,int); - int (*test_control)(int, ...); - void (*randomness)(int,void*); - sqlite3 *(*context_db_handle)(sqlite3_context*); - int (*extended_result_codes)(sqlite3*,int); - int (*limit)(sqlite3*,int,int); - sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*); - const char *(*sql)(sqlite3_stmt*); - int (*status)(int,int*,int*,int); - int (*backup_finish)(sqlite3_backup*); - sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*); - int (*backup_pagecount)(sqlite3_backup*); - int (*backup_remaining)(sqlite3_backup*); - int (*backup_step)(sqlite3_backup*,int); - const char *(*compileoption_get)(int); - int (*compileoption_used)(const char*); - int (*create_function_v2)(sqlite3*,const char*,int,int,void*, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*), - void(*xDestroy)(void*)); - int (*db_config)(sqlite3*,int,...); - sqlite3_mutex *(*db_mutex)(sqlite3*); - int (*db_status)(sqlite3*,int,int*,int*,int); - int (*extended_errcode)(sqlite3*); - void (*log)(int,const char*,...); - sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64); - const char *(*sourceid)(void); - int (*stmt_status)(sqlite3_stmt*,int,int); - int (*strnicmp)(const char*,const char*,int); - int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*); - int (*wal_autocheckpoint)(sqlite3*,int); - int (*wal_checkpoint)(sqlite3*,const char*); - void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*); - int (*blob_reopen)(sqlite3_blob*,sqlite3_int64); - int (*vtab_config)(sqlite3*,int op,...); - int (*vtab_on_conflict)(sqlite3*); - /* Version 3.7.16 and later */ - int (*close_v2)(sqlite3*); - const char *(*db_filename)(sqlite3*,const char*); - int (*db_readonly)(sqlite3*,const char*); - int (*db_release_memory)(sqlite3*); - const char *(*errstr)(int); - int (*stmt_busy)(sqlite3_stmt*); - int (*stmt_readonly)(sqlite3_stmt*); - int (*stricmp)(const char*,const char*); - int (*uri_boolean)(const char*,const char*,int); - sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); - const char *(*uri_parameter)(const char*,const char*); - char *(*vsnprintf)(int,char*,const char*,va_list); - int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); -}; - -/* -** The following macros redefine the API routines so that they are -** redirected throught the global sqlite3_api structure. -** -** This header file is also used by the loadext.c source file -** (part of the main SQLite library - not an extension) so that -** it can get access to the sqlite3_api_routines structure -** definition. But the main library does not want to redefine -** the API. So the redefinition macros are only valid if the -** SQLITE_CORE macros is undefined. -*/ -#ifndef SQLITE_CORE -#define sqlite3_aggregate_context sqlite3_api->aggregate_context -#ifndef SQLITE_OMIT_DEPRECATED -#define sqlite3_aggregate_count sqlite3_api->aggregate_count -#endif -#define sqlite3_bind_blob sqlite3_api->bind_blob -#define sqlite3_bind_double sqlite3_api->bind_double -#define sqlite3_bind_int sqlite3_api->bind_int -#define sqlite3_bind_int64 sqlite3_api->bind_int64 -#define sqlite3_bind_null sqlite3_api->bind_null -#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count -#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index -#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name -#define sqlite3_bind_text sqlite3_api->bind_text -#define sqlite3_bind_text16 sqlite3_api->bind_text16 -#define sqlite3_bind_value sqlite3_api->bind_value -#define sqlite3_busy_handler sqlite3_api->busy_handler -#define sqlite3_busy_timeout sqlite3_api->busy_timeout -#define sqlite3_changes sqlite3_api->changes -#define sqlite3_close sqlite3_api->close -#define sqlite3_collation_needed sqlite3_api->collation_needed -#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 -#define sqlite3_column_blob sqlite3_api->column_blob -#define sqlite3_column_bytes sqlite3_api->column_bytes -#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 -#define sqlite3_column_count sqlite3_api->column_count -#define sqlite3_column_database_name sqlite3_api->column_database_name -#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 -#define sqlite3_column_decltype sqlite3_api->column_decltype -#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 -#define sqlite3_column_double sqlite3_api->column_double -#define sqlite3_column_int sqlite3_api->column_int -#define sqlite3_column_int64 sqlite3_api->column_int64 -#define sqlite3_column_name sqlite3_api->column_name -#define sqlite3_column_name16 sqlite3_api->column_name16 -#define sqlite3_column_origin_name sqlite3_api->column_origin_name -#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 -#define sqlite3_column_table_name sqlite3_api->column_table_name -#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 -#define sqlite3_column_text sqlite3_api->column_text -#define sqlite3_column_text16 sqlite3_api->column_text16 -#define sqlite3_column_type sqlite3_api->column_type -#define sqlite3_column_value sqlite3_api->column_value -#define sqlite3_commit_hook sqlite3_api->commit_hook -#define sqlite3_complete sqlite3_api->complete -#define sqlite3_complete16 sqlite3_api->complete16 -#define sqlite3_create_collation sqlite3_api->create_collation -#define sqlite3_create_collation16 sqlite3_api->create_collation16 -#define sqlite3_create_function sqlite3_api->create_function -#define sqlite3_create_function16 sqlite3_api->create_function16 -#define sqlite3_create_module sqlite3_api->create_module -#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 -#define sqlite3_data_count sqlite3_api->data_count -#define sqlite3_db_handle sqlite3_api->db_handle -#define sqlite3_declare_vtab sqlite3_api->declare_vtab -#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache -#define sqlite3_errcode sqlite3_api->errcode -#define sqlite3_errmsg sqlite3_api->errmsg -#define sqlite3_errmsg16 sqlite3_api->errmsg16 -#define sqlite3_exec sqlite3_api->exec -#ifndef SQLITE_OMIT_DEPRECATED -#define sqlite3_expired sqlite3_api->expired -#endif -#define sqlite3_finalize sqlite3_api->finalize -#define sqlite3_free sqlite3_api->free -#define sqlite3_free_table sqlite3_api->free_table -#define sqlite3_get_autocommit sqlite3_api->get_autocommit -#define sqlite3_get_auxdata sqlite3_api->get_auxdata -#define sqlite3_get_table sqlite3_api->get_table -#ifndef SQLITE_OMIT_DEPRECATED -#define sqlite3_global_recover sqlite3_api->global_recover -#endif -#define sqlite3_interrupt sqlite3_api->interruptx -#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid -#define sqlite3_libversion sqlite3_api->libversion -#define sqlite3_libversion_number sqlite3_api->libversion_number -#define sqlite3_malloc sqlite3_api->malloc -#define sqlite3_mprintf sqlite3_api->mprintf -#define sqlite3_open sqlite3_api->open -#define sqlite3_open16 sqlite3_api->open16 -#define sqlite3_prepare sqlite3_api->prepare -#define sqlite3_prepare16 sqlite3_api->prepare16 -#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 -#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 -#define sqlite3_profile sqlite3_api->profile -#define sqlite3_progress_handler sqlite3_api->progress_handler -#define sqlite3_realloc sqlite3_api->realloc -#define sqlite3_reset sqlite3_api->reset -#define sqlite3_result_blob sqlite3_api->result_blob -#define sqlite3_result_double sqlite3_api->result_double -#define sqlite3_result_error sqlite3_api->result_error -#define sqlite3_result_error16 sqlite3_api->result_error16 -#define sqlite3_result_int sqlite3_api->result_int -#define sqlite3_result_int64 sqlite3_api->result_int64 -#define sqlite3_result_null sqlite3_api->result_null -#define sqlite3_result_text sqlite3_api->result_text -#define sqlite3_result_text16 sqlite3_api->result_text16 -#define sqlite3_result_text16be sqlite3_api->result_text16be -#define sqlite3_result_text16le sqlite3_api->result_text16le -#define sqlite3_result_value sqlite3_api->result_value -#define sqlite3_rollback_hook sqlite3_api->rollback_hook -#define sqlite3_set_authorizer sqlite3_api->set_authorizer -#define sqlite3_set_auxdata sqlite3_api->set_auxdata -#define sqlite3_snprintf sqlite3_api->snprintf -#define sqlite3_step sqlite3_api->step -#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata -#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup -#define sqlite3_total_changes sqlite3_api->total_changes -#define sqlite3_trace sqlite3_api->trace -#ifndef SQLITE_OMIT_DEPRECATED -#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings -#endif -#define sqlite3_update_hook sqlite3_api->update_hook -#define sqlite3_user_data sqlite3_api->user_data -#define sqlite3_value_blob sqlite3_api->value_blob -#define sqlite3_value_bytes sqlite3_api->value_bytes -#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 -#define sqlite3_value_double sqlite3_api->value_double -#define sqlite3_value_int sqlite3_api->value_int -#define sqlite3_value_int64 sqlite3_api->value_int64 -#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type -#define sqlite3_value_text sqlite3_api->value_text -#define sqlite3_value_text16 sqlite3_api->value_text16 -#define sqlite3_value_text16be sqlite3_api->value_text16be -#define sqlite3_value_text16le sqlite3_api->value_text16le -#define sqlite3_value_type sqlite3_api->value_type -#define sqlite3_vmprintf sqlite3_api->vmprintf -#define sqlite3_overload_function sqlite3_api->overload_function -#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 -#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 -#define sqlite3_clear_bindings sqlite3_api->clear_bindings -#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob -#define sqlite3_blob_bytes sqlite3_api->blob_bytes -#define sqlite3_blob_close sqlite3_api->blob_close -#define sqlite3_blob_open sqlite3_api->blob_open -#define sqlite3_blob_read sqlite3_api->blob_read -#define sqlite3_blob_write sqlite3_api->blob_write -#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 -#define sqlite3_file_control sqlite3_api->file_control -#define sqlite3_memory_highwater sqlite3_api->memory_highwater -#define sqlite3_memory_used sqlite3_api->memory_used -#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc -#define sqlite3_mutex_enter sqlite3_api->mutex_enter -#define sqlite3_mutex_free sqlite3_api->mutex_free -#define sqlite3_mutex_leave sqlite3_api->mutex_leave -#define sqlite3_mutex_try sqlite3_api->mutex_try -#define sqlite3_open_v2 sqlite3_api->open_v2 -#define sqlite3_release_memory sqlite3_api->release_memory -#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem -#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig -#define sqlite3_sleep sqlite3_api->sleep -#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit -#define sqlite3_vfs_find sqlite3_api->vfs_find -#define sqlite3_vfs_register sqlite3_api->vfs_register -#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister -#define sqlite3_threadsafe sqlite3_api->xthreadsafe -#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob -#define sqlite3_result_error_code sqlite3_api->result_error_code -#define sqlite3_test_control sqlite3_api->test_control -#define sqlite3_randomness sqlite3_api->randomness -#define sqlite3_context_db_handle sqlite3_api->context_db_handle -#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes -#define sqlite3_limit sqlite3_api->limit -#define sqlite3_next_stmt sqlite3_api->next_stmt -#define sqlite3_sql sqlite3_api->sql -#define sqlite3_status sqlite3_api->status -#define sqlite3_backup_finish sqlite3_api->backup_finish -#define sqlite3_backup_init sqlite3_api->backup_init -#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount -#define sqlite3_backup_remaining sqlite3_api->backup_remaining -#define sqlite3_backup_step sqlite3_api->backup_step -#define sqlite3_compileoption_get sqlite3_api->compileoption_get -#define sqlite3_compileoption_used sqlite3_api->compileoption_used -#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 -#define sqlite3_db_config sqlite3_api->db_config -#define sqlite3_db_mutex sqlite3_api->db_mutex -#define sqlite3_db_status sqlite3_api->db_status -#define sqlite3_extended_errcode sqlite3_api->extended_errcode -#define sqlite3_log sqlite3_api->log -#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 -#define sqlite3_sourceid sqlite3_api->sourceid -#define sqlite3_stmt_status sqlite3_api->stmt_status -#define sqlite3_strnicmp sqlite3_api->strnicmp -#define sqlite3_unlock_notify sqlite3_api->unlock_notify -#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint -#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint -#define sqlite3_wal_hook sqlite3_api->wal_hook -#define sqlite3_blob_reopen sqlite3_api->blob_reopen -#define sqlite3_vtab_config sqlite3_api->vtab_config -#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict -/* Version 3.7.16 and later */ -#define sqlite3_close_v2 sqlite3_api->close_v2 -#define sqlite3_db_filename sqlite3_api->db_filename -#define sqlite3_db_readonly sqlite3_api->db_readonly -#define sqlite3_db_release_memory sqlite3_api->db_release_memory -#define sqlite3_errstr sqlite3_api->errstr -#define sqlite3_stmt_busy sqlite3_api->stmt_busy -#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly -#define sqlite3_stricmp sqlite3_api->stricmp -#define sqlite3_uri_boolean sqlite3_api->uri_boolean -#define sqlite3_uri_int64 sqlite3_api->uri_int64 -#define sqlite3_uri_parameter sqlite3_api->uri_parameter -#define sqlite3_uri_vsnprintf sqlite3_api->vsnprintf -#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 -#endif /* SQLITE_CORE */ - -#ifndef SQLITE_CORE - /* This case when the file really is being compiled as a loadable - ** extension */ -# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; -# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; -# define SQLITE_EXTENSION_INIT3 \ - extern const sqlite3_api_routines *sqlite3_api; -#else - /* This case when the file is being statically linked into the - ** application */ -# define SQLITE_EXTENSION_INIT1 /*no-op*/ -# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ -# define SQLITE_EXTENSION_INIT3 /*no-op*/ -#endif - -#endif /* _SQLITE3EXT_H_ */ diff --git a/TMessagesProj/libs/HockeySDK-3.0.1.jar b/TMessagesProj/libs/HockeySDK-3.0.1.jar deleted file mode 100644 index 7b7d60379028acd168776769067481ae628aaf2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105133 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

    gNjpV#|4IfE4f_Z`f-l~C_ZZe@C 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�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�DY z52o#K1)Fnq9W{&7ey$fb50nVP`yoO@adFza z;4Q)1k;h{<)NMLPp%1wQKzk)M5=bdXOuLog_5@0BDU2csbAW^L*06@&TqXfD(%8*b z=oGEc5J98c#miTrj>BCH_j|NU2z`j#dAtiAnfN`?RoNh5=vhejChm^1yVw=1C;4>c zP3R_3YKKquZ-(@YahQ1z#HbyS*%VT~FaO>6xyH|;Fy06u_RYZX*PXFVzZ-$yas40W z2CgG;t<1Oq8t`ifQ4U|cWHG2-{9K*dQD@>IN(5=GF n3H{wTKR6%OB)d$Yg&&gQ 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%0Aev1I~(7uL$j2z;m{zZVx-um(FN6<-O=Lm#fr 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 AddwR+6|IPw%FYuB{IEFg=@2AoKGFPLF#7> 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%0Aajmx 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%0ANsoi(lof<{ujA$$CB@{OFvp|SK)!MR%x83l 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�H&*{iqLGue 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 z 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

    >zq=o{lJq3qoJ*c=ne{Vbp(=Pm%X3o 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%0Dp9L~(e9Oyw6vL>rLFCJwn$O&Z&E#!y!>V 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˾q3>Mdwq{fnbUGqVcVv}M^V@m&B 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

    Q$vaG(_(-ha;?Z|Z&2B+&FZMTX@aqrT?edCw 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 oN;`!m&lutH%|QjyF~E9lt3|MQ={j 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�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�rO{5N?CQ*~ADb#V) zRB8q_lbS`HLY+aK4b`Og=Fs4!=2HXI5^6cMlDe2$MO{i=MqNQ&NnK5?p{{S?_}@sw zR_bPG5jsJ;h>YBqH?HHYe@=2HXI zlA|2|b?bN!X9RE9M*hSq#t*7pz?x!B0 zHc$^z4^f+_E!1Pw6Vy}GHjSRM)N|DHRCSDffEr1SqDE6=sIgQhHIAAx%JLN5f9)F6tg?J#`;-KlK2$fqIa7h}uMLp&p~2pq>(y@!v+nS?W3J zd8+!HeSjKCjiN?VW2muICpC_mKux3$f$HNwiH2lq3UwScm6}1#q-IgGsa|Rcbuo1r zbv1P(b^GTW|GQ||M{S@sQBP3MQq>nmjYLsnsR`61>Nsj9bp|zu8u)_azmkTf)Rolr z)UDK=)OzXx>LKbeY8&-DHS)NT;TUQhb%;h!3N?c|g*uy>Pc5fbQCCoFsGF&E)IHSw z)PvL}s&s*wGz~G-SgMm6M@^t6Qio8JsL9k6>NsjDHH$ihIs>YY|7;p&Q*)?ZY9)0swTilw zx{SJlx{|t@T0>n=-ALVhlH-3X4cn=8)Sc8_)IHRC>OSgz>H%s4^&s^SwTaq7J#mub z{}c^v)U(uc)bmvJCEJo3NsXdLQ)8&HR3|l#nm|p|=ovyyq9#*QsN<-q)C_7SHH$ih zI)j=`olVW5=2Nu*Jtfp~Y9)0swTilwx{SJlx{|t@T0>n=-ALU`-D;?&w$o5Y-AUa= z-9xRX?xXIf9-uZ*4^j_No2V_+W7HG6V*H(=p^bW$dX9RYs=i{|QzNNS)M#o9HJ0k6 z#!(ZfiJ~(8htQBjO{S($$5B(M8PrT_7Ig}B1~r>Ho0>!QQuCqu_z%!fLM^9OQWsOJ zs7tBKs4J)|sjI2$sT--AsavVrzvB3>qhTj?7j+M{p1O~^pL&4WKs`u3L~WwBP>)g1 zo-&&9+$oO#^E9Z_Y-4I9HHsQdjiJU;ozysL0yU93gqlQ6rlx50jH9MfGpL!=Eb0{M z3~DxYHZ_OprRGxu)DmhrRjZ_DF|~@il)8+%g1VBrnp#6$Pu)n}Ox;S|POYQvG*nZ& zXxKxor|zTfryig-P!CcMQJbhO)ML~W)Kk

    RDYe{?5^Go~piPAD~83qo~o;7-}rl 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�j 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

    ){LwUC*gE!l; zxi!3J=l=vI7vp3@6mTMNYjh{>iPAA!Vc}ytIo-ckx;T zT(9j~(XLh7pH|_^*2`*b`vZIVwnDzk9Tll*wFMFMd7l7X?e4SB@Adm*$S~*3nKNh3 z`JB)7{dsthKbu#g(HRb!h?A=qb2f8|^>i$S>|mC}GMzx(_@CyJ#{FJM|LS$ALotUd?cEqrmS|XvGv$C#foObz7|cWM|Ijb z?HU^~Ez`4+4_jxBPJ+Mxqs*D<*~~1=m{QJW>&XK`D#E-ZO=ik$a93@0>TV0GvO;W> zvIonFu8qijkTomM2vHo`@7mb_jXg+RHzUAc((pR6b9*`>a?IRT1Q@KgL*CEwVpeA@ zfb^quSQdgwW4G-~1HR#9xRb=S>2Vv(rg2-M%jK)>sWH^HUb{t4 zZ`T?k1SHAyasIXUOy*)hh0)W(8JUG3b>J`3qlH^?tx3jh+^@_*-M$6`7h_CH5UX0u z&0twf$?{~TZuFG-6gS&+^wHioK5jqb(&#&e8eJF@ z>Ca0cLely}$Qb)xTqbvl0d#}>`Y8EIDtJUKW=x2;V}G0o*3>uQS4c<9w3nGZHLP<% ze`yS`qo>Va4(YzcJlcWTLQTwZ>`p-blS)YEkFs_pye})r+KInW=|KoOB%u{Vth~_F zj6CRnjQvv#F+FXDny!QkWDermaq4y1Np3q0ptk7-ZdT?736I1{dWl8`tlxU!=72E}^{g;zZCTAF^ z61`!jopSE)=OKhz#m^_g+RH~gd-xiP^b_h+rM(?}<~Q+K$28uH0e zA!8g%u$m~f8*9|3C(xngGEB*r7r$Kg@{O0}uPlD0?3Ej@$X{LjYT2v8jaO~ft-9L{ zgz9a3a3tr)oL*HS;y738fd%ZGag#V9McA+86gzddX4#c97vx+(w!>fLo7!9psBT*m z5iYfD=j=#2;Ygt>Anku@BaUW$xpWYvf&Z5(F;x__ZJ9VM8p=0MZLB1kX@U{95=PiL zf-w^rTHDR%?6W|*Lw}>&(|VpaR_C>tXE4>7gwpS94#h&+!wu{bQ=sFBGo&X@u|m=v zq~uh+vW?PAjLWeeNUY3+E#1Xp!KuBuGc(B8lDe3_F5eC&_o$7qVU&h~K1^j4T2l7| zDla69{QI~&sIS^;vwoOXV9mz{OE*039@~eiY9>aOK!>XsZ_5Fhx5XnS#~OgNllM?Q zqAwG4UIL7lp`DZLnr?t~gDQ%;i0ziFC|`oIB*v;j+0arwjO)h){2^<2Eq;f#S*w-8 zrUUR$$3Nmez(DQ*PveL?#EgSTHUf!Ca`p94QKlQvF{LCqmLe;H4m$t5maLd&W5&U0k?MS^B zO`V8~h5t)5<~*T*`+IxrMDC$#Q`_IPQ>vMEQ}S@M%HPij zl$9*F1%t~i9S#$n56zt3x;}=UK7$Eh_UdZup_t(ZCeY+j>g2woNJIM&bOY)1Xg128shsj!N;Mc4r7go z*&gJ-)A$yN!~W*-NqB(o^lF@+3>z-K)5nc3C%j_p%{{=c${FASz}Gk{ADzuR#M|S% zn9W>Xtln_Qlx^+-(|r(qZZTh%BekNVxbdu=B$$bzKD8YNRVCpa)Kkw{hE>;MPK72| z*n=fUSf(__%en3mZ;UaV$!s=nmo+CQVF?W^x5wQp9wKi+?ZS=+d1UkX`oRPHaM#B% zcKq|>c=j4Prp3h>{bWsM3DnEOoOk=qWWEp+6B`q!VPay&LFE_|I}SR=7vjc2tM~%B zA~2lm61hMsj9aNU8sgd$X-pb@-1|82i-^$cbbFG{*o=d?+tPrR|MEd_+}woy%=@z4 zYT^Z5koGfR3beqE^aK}Ga1-%e4`$*OY*siau>=dbI_q)wxd)@!l^x)xHI*)Y8vZY~ z^a41^@9!m!738}bIwb6F_3E4?>SshPM0SuZldNsBc6Z>AL=9}MBw4BCSqQ0Ey07^R z?3!fzb?u^qG=OZyjbOKj*8Eh^g9$j!4WALnA(Y8wV>?)KQnF`V&38mn`I=+&p{@Qp_D9( zc%Hxo%dqs8(Njg(SW+bZg`%+iFuQ8lMO-E~qisN(jcp5#mALGEKXvcE`z!?S{Y+5Y zPu(SV%QfY6BkX_y_^(K~tBF+(R@-n_6|)C`!75n8RIVwabWIwiYle(>T^aAXLMG9` zjA5Y}i{_dW6%aQ^xD1an%$6ik`$7g+7-JKlyb>P%)SYmbe2SrA|K}%x{y$NNPk>_y z=rapa-0(a_MdO?6aOiOuaLmKO;dlXuC%)fB)N#k}H~1wY)sv$4Ft#eD2skk7xd(>% zT$*{?iCs#1o0nBf*T_a~17Qc@t)sRuAIEN|J{7=Hz*NMIRhg2vgBcpSj;7uMmOBC~gG%ts1N5lgpA1qsDb4@x3b1A{hs% z)zp*7xvd(e(sDBGUaSOi?Z0~};@7yGTgr`qHV+WKG8031DZ1eMk|*MNbsP)5530bo z<$l8nZo6?IH&$KFJv1Lo_Ee=MQvuAfB>1@KKw8UOkNFTPDigXj%X}@_?a1&C+@1e; zypTg4xew29UO)pI&yH@SlwqmmIUwWgz&$&AD6}P3CkZ-}e2p;%0t5Uy(7&P{(F}T8 zG{+l;TZ!k(F5R>nq$)k#Em+;~IeVjipeb?aP*W><+B$5m76!&<`M}uJzS5CljDuAD z9T?H*Wop z28i9TYX(S{2>NK_WW{_KNQSegd!ge@yBz*9^SSYu zxI>Sxe7wBl^Vk9Jmiy2r5D%9j$Cf^cN6h1d10o(Rc_=)F zb-EJ2L*6XJbA@=ZNbpgJ#AfaoWt6L;Qy->Yl@DhbFCMJbJ^p_j-R>{yYN6)`@|z=V95&cU>}^P_nx>IFZ%1lv{hIQ$y(|RqP z<`P7D%uXv&DXdrd$-Zl{;VH?k$vl_&Fmra+nyhnK53^=xM`lc-4*(6Fo*tRepCeIQ zLDzojR(D0(Cef924(Az8^d5+LN+a0>dXZTcj0u=Fap*5n~fGw@u-xtz^hRXU{tpAjT1=0;nVTE{^ntqprac0#wh zzQX#0HH|?~@{KKxV{?||oXwmhL(svEO^tn-dvh9c$bSX(bF#+fF3Bb5tLoQg?agg) zoxf6lK5MLPiH%&(tMAL&Yin?wXV=q#RT)&^oa`eo^o@{xFfYFTQQjQ;3_*69`v{S~ z>zmfv&)TaqA^+mP*P9+>_Sqxy2mZ4+Wpl@55m{5%2et#cS@r#S5%wIW-}VkVWoyb} z)>+PGo=4+!&=JFFZk?^b`mxTfei1hXHpA0!OP^<;CQqtOMRr+w`gF@!c8c{4iT2V_ zB%>Q=6_#4bTfcQf6j*Jm%Af;}aHMx1-6+Nq3`CBGvo_>4R*bQovI?mdvt*bLv=Y$&H%#D>i$oSSg z)d)9SRVj>-#oQF*>fGy~{~6cJ1sPFDGyV|q&D*#IoY9cZ?O8%i@pts(&dQ}U?u~hC zk%%_TONN9>wUR5;q+c7P(2a=0CM_k`eyJ-0szVXi0+6(DeR zv20zg6q=+?GuaaqPDj6=k>@@~uEfQLNLvymlrhNjgo$&wF*5gHIKm9TTKDIYUA{kK zJc5MAaRcl51eVNc93)D#;rOTa`A9>2)<(`Zw`W5+QD8Zr zL8jfd_NBVX=#0>FG@Ep`WKO)6-s<_e$+lD5}GH$lvFBw6S{P0V$QU3%CV(g-9_{vyxIy zNS1r}jxN%P9dtO!i=$a7CqBmd>tp=2GFBl#Mx7f%Ip(T{qcD!stemB3Ts}~l z^jYTNIocBe>cehql#{5paw6HHA(@BQXmKcggQVpmSI`_<3qWfDfSmFgIow0FlDuWG zBV<)9RVGhjCa%=15{IK(n$F}K)OC3YEl3!O-iG(S%1}}*Gcs0-cYVh(JZ6})^YPGo z7XL0Tcv#F__3Dn0RacqdmEUz-^Mo1=;r0{p`(5|r#|v=o{P-pK3C-ggPkZj$?1D6) zo{Moj8wcHSz;^CA*grdy;Txec3CWV#Tk#!+lfI7}8XCFQpCz2&Tzsv$$XcQp8M2bR z8|m{lx&(gEesm4YIT=Is@V}WSec`QQG-jkEljr|{MP0X$ns|?f> zkGkKy;|163uK-p>A)w^vahZz4qGzQZ@47vQh|Q)*ai#*ww1&8*Q}M^3Sg36D*b5h9 zDLwr#=daBH<}z*rHxqGwFlpjH66F_T zupqgs6KWd|ZJ|<2Aq$wpgZ;CG-VTRNq@eI*1vQYFhdDp#d%lAV>|t*4eENBxcf~vg zw8DK~7Bv||c^3ogvv=6L?)&nnOyr9{zzy5m%4aHu@BHVmVu+s_*kQjL*R|FW?>-A- zccyi&;_Tokq4NUXbNJ4IK^ngA5FBhWt>+Af49jq~!gAO;VjrBU@Rl9_m!X}4q4oG} zXuWs(>>EBfvfdckzbpRT$a-UBh5t0Pe^(@Rj6uVJHs4)Yw!=2RUD9~}ouiIvdG}mx z?xbJ{dZ>IGw=^7sQMd{`2}GzReUAy#_V8S8lD?YovNQYEGOvb0;AqY_=gt0!2*-@d=87|P2G(FIXHjjA$EhFVUHH>D=i^^?URKC>6VGf;gr6+VO0PQn)yF5Sy0)nqX>xfvO8 zw>bN{7}apOM;%beHRVV=s3=!CNmlqVIPo!yVB-!9(i|H=d2ig`nsZ9?*No zmyx~NqweV}U(W7XcWbyC5d+`v?bA=o{ufT{4ix>>PId960H0r%elYM?p8U5e`xLiR zc{oT5vh)UZC%y)Gc4lYo*Z2td&R0|^)D_bsOFciuT833xp#p#mA4~mNeHEcdr7%2K zjSrWsmC*A)Cx>V(Ey3uISAyT76yq zzA}ZZv6Eel9N)mig6XHb8}3_70c&r0O>s}>_1j|zNW zcExnV6q#L+5t+Xi7La^NRqho1y4*MD4`u7}Jik;W-c*)JQY7m#72>KqfBm^^!7f}f zi6#^4TwnjE_6ChJ(9hZkr2ZSGEl{3yn)>bcm6NTPOu^%b&EEYHnNHu`aRXxfUhNTX zGSCy&bDLr|J3j?Hqnp?lo%QnJF>Sr1cBT+WXR(UUDR=P^?yC41=`qgB2gnhKxBVNi z24W>~`eT9%KtT@xg&1y>+D{HM1Rm4aKYk){vG}&%Kl%=G-q!ol;Y%g0h=k2G-iPV1 z&3we=aPhbPTVt$DjFxo&-Tp1kEqA_G6L5uE(|wHQUhN0m=VOYPMD2LMG9bNY?H1>o zcj%cLx%+{g{8BDCrcx`&q@~41+oCuIqb_9#?+0`LO-+x zc|oqhk?NY9fH5e1hH8BeoA^>L$-pZl5%jkdA{;5r_+YxhpB)}OGj3h}QDQ-!sCKlX zOOf_c?sNZRoTr!$t3r5xk|1$I8axXq(P?->h_BG0qot|(CEP;&G#SBhN(DhWER$R^ z&2!deL#Z^MyRU3i1;>#@O8XP3;EdYHd}^|!?g-Y+9ZaekK3FOePXJC7;^eVAZU;NF=EwEUIWpcRa#aOt4#$9nQ+3pt{<+@TX{8!%`GF=+MB&wpT!mT#Fy z=ESQ0{eg0+ohktUk6i5MQ%EV9)4+O52CKoc?g&AjDDLv7r~66m5H9PdP~2zEb2u+QTb>CO5H%+T$H zj3sfEZ9hKJ?;jKnSJdA>NEv*m?roKZjin86y|pli4_EE~mo5(8DLmCj32x1XLZ&M3 z&&EcTUHE{D%%i`I%?=)8gcAD1Z?}9%g<}%K9;;aN`f5f7_ zW~#uHBx>yUns?&tD*vVYomd;Qm&%ac#A|o%6V0a?3(GV*j>KI zxRSsOa~GfVOgU$l6lol$`zYT8**-HoDDx zNAr4|!?cK-EdB=Y9S)PbxOU)IT7!17aQzEqi1ZTZUse8LrJroF^pap&XKzqCHHdMy zT~u!8E}7yH%RbqoRC&WRar6b5+(I6o7QY{0!b^ecvMkOLFPeIg$&#&G{t>bmrEtC3 z`?)3am&7N>WA+# zky2*G{D)#0RVOo^E`T_*3k{$K72t$noy5d*Vohi22v-@QTncFy%6w2}kBI^6=f2Xxyxc8J6}lseVfw3Hob@16ny^KC^Oio&%bGu9c*;uziCuC*r;Tv(ZM!v zqB8*~Q!?{8zu&dl!dzlXFtS3c>PwRZMnhvWS>LX8Jh-N(;ddsEXc{&jtmCzi>z;#+ z;0l}%FXABJLIgdf6wMH`V_g%aI-xlo@Pnzzv>&wYZRI>pONW>zCQ|AxshgCScqyB# zPlsE>eU+c|D*p*{Tn73t3ZCj%wIX6gZ@virZDK0|g@WE$<~g;>GFDm%5H><;QxQa9 z1Gs=fnqsIh_*N#6s^|e;#i-lQNnQ$?|CL|kYDkhPi^)MP!NPlJgrA9se;{A>K z(`ump@b{RT;FZ4Owba*ghAEVYXV6o>GHE3jgMQ+_hZ$cS`jd&kY$>ph!o{lTRvgiB z__I#f4{_%3XV2gzOBL(=h>yw1rp+QDG2&&$6Fys;xMLuTKzN|G02-0g-vPzP286*q zhFi>_*Bd#ryd2;f#KQ~ViDD1S` zDnc&&Xgx8+-FUg_gr+r!WLf+|g^cNZxIjNz@ioIpWAvfm>%TyA03HHEO%Nfp%=y?F z7v@Wm&b{H&SfY|$-bACc0bM;#r7Gw`6L&{xv|Kh7X->sNb1C#!i6hK+Fn;^NepW(M z^HFesDy=XbGbT|#nTyeWF-3{G!dkRbcaUf`9u!wizxijC{?qma~azpB%GBv35OxWeD&tFxl= zl~cXLu9$9{PQkhKad+^;egqDbQ;Yfa#)ABkz~)3d{W8BQUq~Q6QX7!F134|bPuzMl zA4`q0FeZLGAMKi)Y0P$%9K3Ztrw?fy2TU^^K!}Nc$~bdApp`#@mk?A|=whCtQx}=@ z$_uVSF^Go!~Os#G3gX4J5=`n1(_^ zt>yoQu+DTf8qcxl;FFCK!a4_Kgs_hLU897s5}LZIElIbvJw>N&hhPWTqN(jvu)6M1 z-W^qM-k%kxxktHYGypFWY+spv;LYts0^HqBZGxSLuujk{5wx2jwu-P=gta1U7h$;) z*m1RFC2tlbh9UK=DTJanoX0N$ zh+Yvpa5k}bqwZA0R^5kCQIgJGe6T_1Y}lf^eZzaOhOBpWzRI{NUlo7Nyi=`3e$!IG z_-&MHxd%B4xoGxcs)$*gFOS<|j>wPG6SRy2Ogi^968i$iLV(*@QNJ{1bv~`pB*yb2 zj806Rv-Y;csyr`igW4|KRMwdqHMIH?M6$=-^B%~>GCz_YXGJlOI_v9XEXp>c-7d)Q{5~^ zqF|*x!>wG6JSy!+W5J3m5I=r0-!Z<$In5v9IrsQ---qeI4X0fG?}WR*)c3xt16vjE zs|r@=!bzi#fr@mGd6@kuM=vJ`N%xpfU3H3;Yck)ETsC!%IipNbXsIKCHBd6tkLu#j zrJd1eB}FcM!er?We1FDi&^S862;#d5FL}&${};*`(#xh3keDv;!o{Gm;tA4wGRAU} z^oPF_c$``aBxHrSKTjbgB6tY4=BP|^Hc;byd_hJ{&{ElxqWNcNtcLHmWC87`OJ0>3 zx#DM2YtY*1znBUGsi4TLYG5C2r7n&7l_^xNOTTQY%B57_V^xWOzd;;h``<@eY0UYc zGuU>i;Ab8E$kuQqXd*m;#j}E~3ag)$e4c*WRYoGU>cho^91)HIS^*n)2FODM7qFAL zz}OYKMJSR>wIJ2d6nQN_Lp{=js+4e z4e7#U@f4}2_=>tg^_3}d1(HW$*qG3pK|h(U1hxis^1txkpx>104*rTG4+piXe=%+0 zT7&9PazyPJQD^drJm$Ju$F~Ok!b>7fpr$mk>6_pVcxEK)G zs@{)BekZHrr&~{}Cqzt&Je$2PJJdQI(Oy#{B5*b>vOjBP#M!Lr);j*YW=^Cil#;H? zda%5~)Pr3uIX*ezzA8f|w=Rlb2kLR?EKvWe4cs$VZ;CVfRRHF zc%pq01vB&llELU(2_n0Lz;Cnvx1|u4+6MzLkHXR&9uHOXypYZ&I_xJnl@t?XT zFPVM{8A86#`S;00vI^##i>*oW(I`B{`S}p!LLFcUtF3<0#fB12Zk1U?0W+5A44&a9xPcj90Ic8u zg4!V`2uIVK^6SP3jN_}Kb?6Fl=;aC1J0C`_Q zp6(hH*GuSdUu%lws+@@3gk!(ZTx8q>##_cZHT5*k95VK#i&`WoPWcff!{O#~QR3_r z**LHsC%B8~P$6()7t7{B96Q221D#qWM?|x)2DiC6vtqT3j&j-=rhh96i9~ z{CWbna<}+=_@jK{7c29!royTIW>YbjZHVXcEmu@GgRVksXfeDYFR*+A!ct)6x#O@H zOQS+9MB4{JJu1W!W>L_PZEkcmeUFX|yyHD4m3dte%N^q;D@H(n`lZE~_D72!O=<{E z%@6!`S+#XD^Nr>mMLn7=<|Zlj$bi}vHO=C~`pgNm_>5Ou?gaIy2{p^)uJb;Y?f5|S z^dzQ7b2DIzp<49|Hs@HX1s%M~PYs_M*kby?@JEuGr0u-AR`U)2S>O$q9(=rpo^>Ti zuEj^QB+2}>r2_W~P|T=?`sS(ZVQ$(~Du@PXGHo5pZbQiRbasmC*B7Yx-t5$=1h=b` zN|Du5Q7ckp(SRvj8Tu=;l{(4o<)c<)a#z5(S1S>&L%qyg<|*}I&eM8C=TU36%I8xu zv*r67O7?x)c4ZAkhj}qm!%ymjAM2_Euc+Pdl0zV;Dh|RJ9B`B z3nuSACS@gp(eDTTXxfC=LqLNNu4Jc%Wz74o?!LN5^BwPiI)=!3|4-9r%BmGwsvx(9 z?;P`%?$v08hX}q8)a3cKI<5qvnA@o&Gud_va%%Xh6-j=G0Fx(47BA9sC&H_2A0~y(lLx3d`DcC9HM}Ua<*2;18)Df0l*1e`6 z>xmhkP`@MwS)Z|%44xh37Uk69+&*wU$LYGB%)RcH0Iwdq?URknr zYSd-yV^yTx2vyH z^o--opGjmx4&eqxgDHAmhXAU7N&qc_OFnPN5iB=VS1>KE@|+=7vD)&D>PvpL)y`CM z(m=azsbLD%b^;e>xyq+2G#p9jU*-m2EE1?a(2Egr%wpd+6+hUfjJ?Y}=Kz_pu1IuNE=%(r} z;$;YlJpq+=J~p*v9r^DRmR&wHXoLtCbGo+3+|!5`O;8Atc>_)NTR%tBGujAwIkTc3 zeHZ zW&6}1G6!Op2wU7 z({+z2;@(U@m#$W7ST_Vv8MyVpINJeh&?YRiZ{SdTli8Y_1XLRZcCQeN&62`ZT8iL1 z|Fbz{JUvZr`NDY3ygFCwqLF2M2zzn1+(KwX_RR^%hhUg_Hur9~g@8M7+tnA$*99oa z4(VzUlSUpuz{TT)^Tu&-oAUEmV=#>-wp;rC&tM1(m-OERECHgN>wM~ zeF^9|k)mq)h%IcGqZDrz!n(~ab%kkv-uIW-O<-+^gTDn1{?`RNcY)c-mAT;ifq$Ap z9hZ*`KhD*A)>FCMb@`u-qmS=Gc*wep(Z|aNolURH^+Xh1UTWOM^;?{Y>E_+2b@0T` ziMxzdnWK-lnETTPcp(c12tQbY;RQCXESlDo%S%<~(ysCgC}IWv)Up$iKQ~}6DN!1! z+osP1Q;M!ay~gsLiMZQV=Ts?qt?vdVW>I7sL{qtwQXtr_{PcGEUW5 zvom6aoyvaOWge-^O~-i=*zVYt{`4ZWQly;1(lh$AE}M3$`tvi5R}k7e#r!aH`Z#zJ zwM<}(kUMqAfGZ4GaI<6n;Ox2c|I30qXuut%jOEH1tsF6u4L>)JpFla9n%$z$WfRkF ziljnW&eiY<#!Kc8p-1{h^MKiws=FpM7dgM`aslF}?bY5J^8x2%#s`|Uk(uJ!B4+emq$PbW1V4j2J3k;G7>Ra~~NXcQqEnT94I%EeThGe8nH3js&`oQgHP5P4l=T#!29w^oBA{BX0GF zAFVV~Li{BbLiC;_Q%GBxX_l?96DtFJS@=ND`DZsotgu)guTPSVWm8<;xXy?#QL^t~YP7L40|l^`DhP z{(a@4x|fubYU}6#!rdJ(c(X?UN7)2az&ASzgYNU|>{0ejO3{~ua;(dWToIKuR=pva z+J$T%yVu!7yB_7Z?FOd&uId%;yVtD{Ja$Fp58EAS^V;UU!*kb8lCw3xR26PUgtlz> z4k88m?1;=AvC9;n!H?YW$ew5%wYvp|6v>VRn3{ce>~IBB`t6vH|D+}UJFfB-nrF6s z59`mlyhq(%_h<01cdQt&g_J1QW%sX$T7H=)))1|cp0QI>UecQm&%##V5RJYAnd9|h||MP|Wp$S(Q zOVRKEB(=f?!?mz!Gj_#2zQhv@i8D~zyCUV87$n=BwSv$#lbk57JmN~Ax$`kE3t#D@1O%uwvwI~ z#=6Xgwf${GceT#gpX)T2;w&1rfIg+f)o?FuraT;`AS{psUc z;VTWm0Ss;ZB7|LR)Glh>sQU!wiH}_72|2sJbw2kzA^=zAHUWwxhxxJlbY~Id{a^;U zBXWQ2KGq4VKXu#eV%ZWW8-;#ba7>FCo2$#%IMG-VXh)9AG+u3<%En@=NTPo1F6|^n z#+6JOuScNOz~tMGvLCyPJF9Gm16pNj7hpR;8X)I|JSFEnB9Di2l$3!T>Mo zHuEhoXQhERfqxsm75Nw+ch7iO3jXeKci2N>`65CCaULRPWCtY6i0qKW!ttavtXP$0 zgnx@U6XXZMs|_a_Gva7v1@}iVv*A_|TZxhKW_?}1A?#RoJKmn2`YU4rMX03;8KH*S zz+}KaO-#c{G1Hl(1WI`tDhT)55UVMn9KI^q!1~_~H6uOsxU5w7Q+=_rR8zy(^ZQkA zGoNE`f7!9h+P~t3*z3$>rc`+hd=8{z%@%Glv|al60}$@B0KR9Mx4^Zqg9n%NW@rLM z)0+fSg=-B*b6PkR&=*Pr%J7Mvs?xM1FeM2m}`NWCRGcAVQ_KA$BzMl2o! z(41ZJQ+ac;Wb?~?*DSx6N0M`u`_4`~w|ulwEIX5V!5o>f)&=-NIfc6qtL(n9esSmX zPC*reVFEwYpLK|nkJCGlk|yvF)g|jRKd>|6dVfOg%Lq@XVH$NKk#-qgFbv)<8NUP_ zcSzEmj}Wc}Ekw=WQ+U!&xT-Rp!tt6t(;%9Y4h!IRYOx{7`iyj*exU$QzezGENqy$Q z(>GHV;Afck4@cX4I-J}}Zft=gA#g5~Nz^98ap3p&XNiJO)XfB3bKca<&`<5doS#29 zWj}A9$u6cM*n^BUbmi1x&YB13@_X|mR>-5*u>|dZ`k$K3>(bzY={S#M8<&iiW0Qbw`E6>Nxtxj2BqGML7Ekq_)U902 z{HnZF_L{h0UhLFAs>++muAMrWUv19?wJ5xGK5r;@Kw#a+SeV2+Xn4yidob(n6u~mA za3=@~#+E|hU%BD*hM{E%cY#uiYrrlk;JLWK<++IO>0i#B&wJ02f!^YQa z7t8}f#q9Kf84;1YCNo8zq9_{|VNayCaTP!ZDCSn>?P1R4k)#_uvr#^arFK~mjI}mQ z?Cg5r)@G#@pevltD%f@OzJeIwHD zDP2r?i3`!>Q6|z>3;}yT*Jmw7X1I?yV0{JcTJ``F30god9;qm^p*##Fh$2)9XxBJvy}y{Lwxawj^ML6DMqGw9iC z(uLW%1vcWFG@&_+T@+KD7h#($o{_pBW-_uLRp-q}O^W%*^=ks?1o=NP=Ctc~Ro=O;%LitNMEXjfEa6eJVM- zQ0N)7aoNCCxAoq*`XHBF*RS_+U60qh>aVZP`ys|oP4)>l%ca|Bf^Dz`9_}WF_{f&f zg^U&(TnRD?`$^B(wlL)k(TY^(G3>S2UfTsE-PxN#;x-?&N7>h<%}#%4 zjkH~ik$@{eVj|@4o1HO%=}CW(%dlPD+wWEnfHF7SZCtCmx~w4ZK~~qYLRA$KuWbli zjq^>a{>-b(-VThwd68-z&bI_cWOgkpR`q9GUG~Sovl(5>R$I@f9}&37oUPnhYbS{7 z1aXQ4QM}SM8I-0Bil>6~PFtV-k)4rR^hDr>Z=Wqd3JPwIlN@H`Qk|X=1JA*yz;4#t zaG%8W&XnvG*tcHOhuHk22bsP+Kju;1KU?U`B`wUf58W@!CJp47^_9qX_H+ZbT++ZC zG!XSf10k*kdTc`tJhV|h)i$%f6FJYGzP~bu-0uhHHZg+l2VNnFCDuaHg~N<@u-vg$ zP{tyY{X|yF%*MizhLwc7Lza;cSmkA+a1SJzCAnS`TmpFjGmu6qiwnsMpjX>k8MRab z4`-czIGdsWno;A6Ps)_yO1jJE`K5#bI(Z7NEsJ6{>Yk}5zLe+l5)*iCc;O+QR*RIv zcBC2DXjm}M+Yujk!2Ci-VL*WBXlsnIvxDe9Z+4u|Ey#_8*+8ql#q{KMb?^T1wT!hn zk+~JhX@98B>C35+O}7v&|Lc~IEx%ZxAE@2XSj7cD#RHOXmUr4ENItNg8?Q07owUDd zKcDB?hJ?X=sKvDneb#!ah+v&um)|S8E)U;)UH&SLQ=7k*KO0BlAa>}I>d)r|#;C#F zC8a{FrW8JF(jK&`;|f(;8o(pN^HIjK#`Rhd-v$oqSwkBDN>xgA zSGVNH$KBq2Vx=%PwUYaD>ki#5Fwr-`L?c_(;0;sS+B+EbOe@1;^C8<*{mIr}JIFd8 zLcJf_?+Fd~(g!FfD8t$p$oltZk9Kr*f7j(@{LJiSyiR|X=oLpaC>s+!fi(G+MygK1 zH4nikQh%1X@`W0XFcPHk5*#~mRN(lHO#+uBW=|xXh}nh^orAo_yz#^c#74nv<;vv! z<>NzqG?$S`JxA5{H6Ae@iEBwdlqd>`t370VKjts7Evba^zaN((I+XYxz-Zo!84s+P z_hQGd6b>^4f;(XPV7>UreI9 zx=Xr>G`G#=u`ROl7v+T(riu4di@=QLFkRgny57a^e=4hme>Lmr%(5jhYO_CLNOlU) z!zS@NToJopH7@7y26dk|zWE}+)3(i(o#8Cc3NoHM%cVm>wSl9yJp3V_zJ?9^$Qz(Ho&Q2cJ>GM61PuxuF42hPHAHZ44JSqhc1 zY>AHb@#WZ?%@|0+K-@H_L2}p?5AAw?{#Q=L|gDOB9hf zhu?$$Ueio*_m&awJ-xo%{}gtGS5wK^y+Tj*Dc4!}dT-Pq z*Ir%kgHp4;(Er5x=Q`pzB`C?`ZoZc=Va+fQjW^E*{2cnmb> zhlU55^Fzaf#b_9%XxQ(>dN)V||I>j~4KI$4ImC>PB`8lVvN5i=8-q6`@am&63*;-G zc~Qgo3|)9c$m}QE%JDoi=*k zInW0xP6 zw;7E>o>M1i#%nJOOaErJ@muvvdacAQT85OaUOsOM`WF#Y``@yE$O@HnX|1RR@xC8B zRP5W%m|I~*5nxQ9R)rsUgfvcHNGYW20Xp-dp->Z6m?GMz+utCXL8(i*XBtC`W`nj9 zNA3zBzghrV<|ds9r*2OGHbm=RH1JGlp=ibnh?9Q1gAO~WYp>hTA&Zk4g+k^Q6UJ)r z#-|?o$IzO|Oi0H6>bPyISJ3<9(f;i1jE#`;ia@vD>3Aro_l=M4v_a8`y`c;Ngv09p z5xouH^)2MK)QYHQ_am0@AJIh}tMF;a=OpogoA6tN<4Iy>w0c{2obX_;3&4E1X5C`- zVc(Abn(^4-ony@LC|w84!|mL)oGm#qhC=RZX4nqzTx0InNG!c2_ZogZcX->3wyzn{ zjxDxpwqbijrC&2%J4^=8a=OfIo7WzJTc>(F#XEW|d(c|sNkDJOKHP3OY6a44kgM6?Cz>tl^DH}%OFA^( zb+v4X>bDNP*(V-+7se<;v+^afC+@WMiON(qa;NX$o&LYwxwOx#{D2M56!1_l*F$}t zxHX~A|0xEdhEt0GCWtuUD>%NuQH$dn96e89J|B)B!&2&X$PqLWx$vmx<~C58QjU6- z(r7Fh7VIpJ*BSxFXKAtM$yMMa6f|P}Ytk~(NMQvE4Y-Q z6Ii%oocX;Q5b;h;*yTv!7T`|%6L(sAlQ^YCBDautZP?P0{@cSd1|R)muO4@ISoT|7 z@83|^A@HtYm$T&@Z`2ulS9Kzb1$odcRNcUhciHpo9ShKnBvz4;)MAj2r4~W&zcT5HFQruuyry^n37-#DPBd1K)ap(^DPz{qhG_Kd$vm_Ah z40PxE13kAt9Z;6?#(~e*pz4qtg`w|L#>of!UHxD-9)>TEhe^;K(pTvd-TCkVwpe^~ z40Hw&w%t2CjXJ=!bei`p@&4^`<>YbL6dN;o+HXJh`nQu8nUDkmG%;z6LkWtXeV1$& z&tS7)v004#Mq(rz1;c);S)vz--Qc;D0h?BUl$9wNNfjZ%KY|3i*Ed8D+|m9m3FRL8 z?;qcGbrA9^`Iu6zREr_D?Y|kOX~~jlG}#hOMz)XUQ1%ET@LyXpMi^T%M;JBa$hrar zX-4L7V@B3)oE^&aHXh0vrD@5=b(+k4GT$Xt1XlOVJ08?UY{xGvMo>*}N~!e;il=CN z?)-OMYP}$ra~(4@Ma>7ZyV>b zqq^#P7LG2ODwh;`gYEda!K}HxSXE@cX2z#2o?Z89^mhKeU9fGs8C{ZB9A2 zCdUn=#7)z0HFF-;vC)+nC{{%UUX{fm5HXSaW8x76=+2|YL5l$pf(gEkIcg(!T~=!@ zuuvMUL5m4~JyjHbT{0TEAT~3Vz!NI4(o=kEEu5Cw#8KaV(9CMmxq5`W&{6V4p%!=~ zKhzC}ReF1`7nRK!B|z}}wyc>A?2;vLm8OE6rNH;CL}hWLSSh+xkhUIoRMu5li#4~* z&0t&I8@ymGYKnOane9E;TlU_ZJ1aJ0u}aa7w51_N#lD5a_D1doRjAns*n$H<0{=rZ zWGd=*exV>g1vxF81=@j_0;fa4o~?&%<|<=iZe@RoM!&f8#USA7&8$Mrg#0`4{Zl8{{(IS`Ht}MVB-_AH)*W-YkzCJy7@y_ z^gI@UUK`H;I2Ms=Ft}&V$dU%TbOs?=j{vLx)KJc*fu7_^Oncoa4Db>IpD zlu%iR5Z=E+QmO%fnI8!>!#5Q*9VMZnj>nAz7Wk<7d$$tqeWd2u<^s~##+A&Y>Y|z+ zcOUN~mLV-dR*7ng%ofO^c)MSjd%llBxE^cD;wlrv#NkjyDWnVZVbWys?lK}-E8NCO zub`dw#>%|jT;h~?T`mz^zVELfVZ5KTkYSi3nQlNi-V&!ry3Im{@^yD!eE0`ry7gva zXCA8muJ%pTuI?pu*O8Be+Q%QRGaf|k5c|K@o{;6{{7dhvv7|mGDr)b3DC`6szL{vV zH(Q5pSgB72=t7~4VXU~}Prb{Z=uE-GY~!4q-n^TM8Y`tF+OAKa?fMPP$pz-LEN&;4 z)V9=^-Zrp8R^IMOpVvO0YxW-w)CUECU6Ld`3>;e+gt7{V?Ims`{&=%`QPPNV<}Yoe zs^(v-{!7hFSIvLZ=)ctb;s01u`2FK|x4j`5*qZ=M1CFSSm<*^roTS6c&%2!vlee6n zw;L_54W5f`@3+isPnC}DAd~_cF6v=A6{H6la#0J%oi?(t=Rk)xX<7=UlV@05Yt1pb z{Y>r$p#Qi*CqFcJQP)lyXtCJaY30cIovpOeXZ|Z~v~u|TX#Dk>FKJ`M)$Mn>qwWyZ zTMul)U*Mqb03j2G# zgP@O%HgDCb>o?>)CXgfQ&(gH0LQNFa-G=OFN0H`G_abfpldy$asE$1t@#7MWZvg%pmM5rAK&851Z zA@n#q0#UzRfGywe25ELet>>iYYb61cW@DP$Yx>tVzINd?x7YQrZ+!j2>ogwd=pbFV zaf6)ycgIGY`yshRita*MZ3kR1s15&e*Adqp?REJ!T4T$q%yCzppkj4}va9m9kiK9B zlb>;_L+}Z>44n)a%2phAa5!<){%_jeJT8hWT?0N0FMGcAzB5Kp! z99didHxPwpi8iQ-$s~@(rP?JKTxNzX%BqQ)jJPDkC1c{6n9Phx?hL4N;{csB(bz7N zq-Sz(Fq+8soJON&CUd_(zVG*=it4IUr_R2-@AEz{j{jlT4{fhn+6LAPX$+|S1sqb4 z2>+UA;2C=WXqg_XRoAF$2Q)sF6;u^keIZX%`()OIyujL}I0t*q{*58Enx>{a-`YT& z{c3}84ry$ns;2YuoPZ{HzO)gnVz9oCH#%Z=1nneIUQQ0wxqjoy#!gKe)xIDzTd#2c zgn8sA1y(zPmTVjJNLa+^?-OTBCK`-uC%EnSldEWn8IuPdDT z`osi<`}JE>GmY9R(|L!!o*V5qj@{dHOHR*9)0U0>QkrdW=t{PIVLhcRt~a zYa~Ox+XplnkrNWpR9K(p)1_+iZ)D_?s#^aVMSNYyz(x{zVNPIU6X}2t6cRtq5!#5c z*Z>-fD9v0h;WaW^TQ=tk2PhnVvtKH0*@`IdsDW3w`F8L>-oLr$-p%HR0$#ayuiJBv z8`b}M)XM(XrFDLZdrcp8Jk}V{G^kByeX#L#pHyYl(+#eWOm$NgMP|AhT&jH`D+V@( z)@xfsmSxhv_kMW8OdoqmR@ZJt{Wt#8*VAn-VN0EkqZ@}4$7~VYewa|~m_)ANH~!>@ z+r*|e@2YybFI{Z%sZm;k8`)f9=^5BWqJ%0o=6ls{p&?CNok0?ug>td6iU;?L&5Q2cpJ71)Jx?~_ z4W>q&V#bwbhGniNncK@By!EvCmp{Js@ZGiMxr;Xg7dl=ePZs7_CaYK;9(>|$x_$9N z%Yzr#C;AgL1D`lSLl?7W{hwzE?*IIvhu(OQjZ@lBmP|xwR+ecf%`dgvmnQ`%wB`#lcW?G)5}iniZ&!-9ySG{dy7X@%z3 zOv=s$V7h&hj$6ssd++dR7`IGm<(kD7FhSOVGqL@HtG+*xC9(OzeRK-7ADNaV!=W_z zt@(BVQXBWl%&fC{dE6PDoxqS*m;&t5MtA*Jyu0phS{BW?oHs>u8|Im|5xr33S>cQY zSrhbF3bq2`-Rtg7MDpWxb_3z`SObm%n1MO2b{p)9O3J&RzKcyeH(d9nI2IIdV^za7 z&&lRpw&9vI%h%eF;6B~xi;0nmk0&~YWh^Qjma)n#dMqH}{mFyz%@uc9Qw+R&`du%n z4F5Cl4(AE~f=T5_F}!Ny-KM+jS1f+0e+4P;OKdM2V7dpFMw!Lh9=3XQro_h}5`yba|F*mR|;}Q-w^^#i< z%i+3F`{D@2$ZItNaVT%3&Owqj$yg*M_y$_^V8LIem=gWwxIb1&Lv3mX< zHjgK5$BS2&Y*D9xa%Qz*emH2?O3!FX^d#w=_D=ElB_~VP)8?^TK%tvX)&I4+bWI5# zvA!@8=-#RH6&nzJLkBu$!?1p$lrpA@CRe~Yd*l;f0#L31kaOf2&Y630o*&bN>hN&? zG3r0LpZjk`c^W=z2kb;yG_uIZZFC#HJQ3NY6%pmDU^8WKqwc8ggzraQfgl3#5%w~XH>!qbPF`)=am6XkJm zUyJoq;WT=~R%%`?LyAv^P3zFFfC2&b>b(2&@0n;oulv4y;$k+1l$wXyb{I}Dss9HP zOO50QSOjvT)niVS{7?cT!uBNB4y+l+OP%@0Y)K=zNWp#ihqo7hZ(C#ALiG75wm2z% znJ7ccOnSR_V4wVAcuG0!-nA#8k%+X#f$?wv*oo5~88UQQ zE;)FGxInFY!*#RQ@9WoZ_) z6YA%*T&zzFi97aZ2^BKY)MsGMZ%CC4bWc-yDb7~>(z$80Y;MmdZK$H4MR=~{DW z`7v5=nL%lJilkB3=!Enp zU(v6QwF%lBP_3v9Zpdtk5(7sLdqXb_sFOu5O0VIggH^uURdqsb)aza^`PU5CIi)$M z1+vA$%c6I4U~T+@fEE%ptVq?uMu8nYvYuDBpyf6V+e>187Wd#R%39Xf?RWyaIk*)ndn;?@Z|1GnDB(t}Nv@6bi~ zHCb~4zuEtH0L=EWpvOHio}k=L1C}{Y&^2aZ=K-vPfPY?NZlygIAL(x}v|eEzU=?<9 zE&Qlez-yfqmGuP{pBDdY(j<&jCz9HI=x{4sD&~Bn`x}rEvqF5eC($;loJkMl9(YJO zAk`WU8fr9eXsUi;d&YCWq^H!%MOIi>Sr6L|dG1W@*=^+`_gRn2)_>Z*Dd%e%fn^|$ zh#siKtcu9bt#_<^bq)2|p6&F5W8F=(*rtv>LA?xHOmhIzP(vZfg}-5Y2aL`JL$buj zZbWPLHvGHMhV5OPJ*-t7VYC!mZuXA;@`mlQ zjU_$OHq`bv^SMxeW4Ud!>9y`+8$n_P!`pO=X>S*aMNNnAbvdNC&cTC7N2`-nSc~_U zx`PDxC)TM>qx02U(kN~~`_W&IsXx}E;6iM-TV7GURkP^iuab+e5qqW1{cwXBvKUwTRIOg@-tGSF3RW}c4;Zg#2 z@)N!52FNe@HlqVh=2G~H0o#4+)GrOW>a)|kW!QlUwvq)+>I-7&Y~SWpwulw%I&#@@ zTf}P5)w7Y3A@R0NyJDDBquvbg!9`bK)7I#xNP(qb<=b?_)rE!|(DZ#{{b#Yw@?^N8 zvfScV`DFM)L%GFf@wfX#^7cDcpY3u4+x;++85V_&u~@-G0^0}V@_y?s>mlpmV(nf< zrM}g#(%|>1SVM{q0pltyDA0 znpiBh`d8}SNUoe<7a|P@r2~F;^orW$S6QjrV-L_iGF<-2kg&+p|9iiPY635Sq1FUj zO@mH4Y~xvb?dBwQ4w3$8Q{WltR!Z!wlM>5?N1i`Z?)Av?!{y$OJa?D-#BRWwfs)LS zxS|vczbCN{MZ|99K&gdHGGb^L9^W3)5M-QcDozb<-esyu%{BR%!f|gbH|!vs5=R(5 z1~2-%ji%cdf}2ZeS(*=?4Li6`dw%|hv$(`&_>2u{KCPbE7P+ENj9vEd=9EN^Q zn_Vuq{E&cQXPZ~;+$=%bOfMJC$q1Ez3^JY9WtnGXFp=sxac0&gm}TL8IYVs}gRnjH170J?v)aGz@rlM%OGQ-7(q{DMN<^;4 zOUP~QzuDg`T}QtO zJz#{%W_YxeXRM?OJTYA7lI*Z4+-4l9iB8|>_P+Kww(wD!$*OqGB6BIGv(L15LX)L` zgeFKY$nII!&yl6NIM2?{3Z{|_@Hd+17SLSfP?xqqH{c>M42I2ek|d@+SVW{m00|d; z#uWgwqXJW~w=R{T+`S#!P0H@yn*6$wq2a9BHeHev;lPyP3bbSS9g^%)?{9k-@jRqm)th z@CR3vd}mEA5mHW;aAQYy*$qJw;UgqrJgi+}>`-s+r%LC*Pkl)q{Q#B9gA2DbO=>4m z>Z0{BOvlrUX2GSVK{r|&X50nR)!CNE>}l!*qfzUH!P%I0x#Rq_Jj##qyo^^r@0f~B zhyZ8n!k8h_&E9XXuf?xp70R(A@ymUk*^aeQA%c=uK+tfr_v-bNcy6Sv+A&hVn47(y zUcU)bXB+lJFHjjv?$#G5dxhV(g(ep>t@q~3x8abWm8ztP<=@%(WD>cR?xWCcBB@W% z>xB@WN9PnlTPkL#Jq9Sb>Pmi8sxF%{M}9j@*E^=sFO^?{O*=zh74vKQZGMKH-^cs_ z?WSu=Etn1Y5z`$fE2<1<<@}|Urz#W^4$uN6QaP4OJVXnihP+c!hHb*l!ZE_TSTYaS zRKb38wRKcwBb`{v5K)bmr7+K2s%G3578;$q+Ez#TktO;yi&GX4&3&d)7|V!f%Cx)a zd@{>Yre-!T&s$A2r4-)aY4UGo(GvUW#U)gZ0>^R6Vj&?|uYv2hS@zo%)exyoMf*Kf zF^!PO<=O;kj`k2;3s-_krOUN%qTePj<`cXt|60gL@kKDLqx-}$_!ttT?N3lH{cG-W zJu~ROit_li=_(vio2Z9;66IVK{uX$)#)wPN>=(HbMC>!yAe#D5EE&X zQmXj@$6*yVqj1rYzp7##<*Je-RU)ZQNyw*y`^If%RJN*OI$cr5Z6h^Fk|y!_#m0p3 z<$}BW_MOGaOOAocOs^?~_uscf20-0`0Y6OI2JU#$@n25aZg?-hi@5^vsN4R_$*A?( z!+jO3kagSz-5~Bu-EC~h4#Hyd7w~!ANOLS8QH|*9{ofzHD_2@yz%;VQX`?h2!(5P4A%}YPn!_RS$k$1l@J6BaSZebt$NT)@v znLI0f8Dq1U_rV!C>AKVd`kKi2Wj~ZN@4qX%A(V&xC4i?)XzJ*> zTb^ir%Gr_Cchw9WOFD}39QQO}b?@aj-LD?UNI>l>=?K?;*g_W&BQ4Orha6)~(D{1L zzsvC{PmV*oe?F5k%jH@KUs(Pm=etlW)H<>oD`-z?;iIs-nUJ53RF7CMXqzz3- zm{8nG{hj^K*n5I|!EF))yHHP=uw34p17p07Wv(@-xcH5%1izVsY<8@}9oE8ZmDjhd zS~8;2F4MmfyJ0gm@#&}bc8M^o5aJg<$JlPkc=v-rj1xF3@m~p zg$W>7A@5pX6;tu9rGUIu*hVMWMhVmDw?V-kx|KPgTbWLmdyiGUNe2Ry{|r=|^DNI> z{WO%$G5g`0wbUfTO0^I_nT`Hh+q;&b!kd;!Fg*B1q(NuA+aR-MflcOqaJ(Xfi=)^Qap34E-$+hn3ttT(F(Z_Jlm| z>F&(ZexA7|&)y0&!Tm68TL9k= z`3S*GwKj) z9zt|p(FRL8$+LVAWb{T-Rq_ICgjcXsqdoFf4C^%wO_J~%C|}QP;`1ylcTZp%+7G@e z-~LpqQ`7$Bh{@pU`9ypOpZT~$Xeh&WI?$$Q6zW6mX4_1A5VVIe4zGHCG>Ozt*U#99 zzIDtr)YG#J_CuzS?srTvau*wXZshW#o72?od?JZ>rSL{!rMOwwX1eAWkj?_$bogiT zqi^Ikr+wAo^T;NJfidDe#=0+hddCG%Px-`k-!LWN=my*5jCl}EYuYDG)oIC4b^C32 zn5{Lb+9zO$_idMNd#J&^+Q;K3-=2hXdWX4u)UEJ0FDVwY z^M?Lw+q^JtXqbG-WXlQThUhNUn#3-11u^)=M_x)e8RCiTZ|%3E_Q1j9U)vWNjHYi~ ze(|5Q$Ho7(Jth7^`y$-A;d%;Zmum^mS6oYR?r|-~`BPUp&RwnwoG-Zy9q=*a#IXPd z2M3_cJPv)uQ6qMm4Q%`eYZEiRaA>88@M^jlO{OP11sh6b{NwE^cn43;eBKgl8;?7D z{P6afV0szpsKt4z{Y{T?;5s#jWF6Fgk^QcVkLC?dmm*qWaJYnM!O-dQiuN)< zj1%o`xajhU_Azu|7gQO7A<>@15fOVmk3Q$TuZNK0?*Iz9acsr?)wpMaU$VYGUEMv(2?`vEi0Jq zA_19nFX+2tdk55$da)jJ#7t=QKE1Uo-)Pao-SYG0%wy7EOhu1&)1XW<4S=ieejtj; za-O`B5BJ9Iaecew{Lfv=Ouvlvd8v8CfZ@0OMc3b4H{jp!RJ*UIO12vMp&8#}-_E>U zU&H^0Czk=hx}U4a&lIE=+SX+cSv)s0Z^pXpeYUw7vc;5r%{C{)njKfp&bIQ|IPa}s z=Q!IecE={Of3q@5vjZBA0twXvujj1Q4s6fy{11k*h!`&C!4DLKD?Q*t0qGWui^BW7 z9vO(3$lu;xcHW50SF+_bh@y-UL~x-_Q>o8u)@<@BZ`G zVOc_iGkXxKOio1f%;t;X-Zqg}vgZNsBxVBnoE>uSBjr6JKJpko@-ezhH+n@GTJWR} z-$xKL3@vjF&+1V{%{Ul>Wz~4N=ck!Y@kZ~B>&%X^JF_a`M(>sDUH3eQ-@wlP zZ<#Pjc((M}-OpZrHuAaB=XO7L`MKTM7c>8w!5P^9-PvUkCD|8H=@&Bm3?2R?U}o0y_a=0`!6j2AYxk9BcQ04_k5gnJMUu@S%RcWN;RdX!foUb z(yr`bVZ3_&n5B;RJo^s_^9O|aL&hOet1ZnwmBE&u#d)NfZECl|(NUh6q05}8SXS

    >EEnHSJhh4cOp*G-Ifk0D{Y_Jd$9a}x( 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 delta 323729 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 Z@SDr784Eo}Xh@HAQbL2LllrA_{l7l%n#KSC diff --git a/TMessagesProj/libs/x86/libtmessages.so b/TMessagesProj/libs/x86/libtmessages.so index 6375537c5d81a06dd78a77b0dfb8199bd7372c2c..c5f0c5f6b18d224803d0cce873eae44414692442 100755 GIT binary patch literal 1352692 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

    #}m-d+u7y2*4m5Q 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

    pwOthc^U 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 |JFA|!sG_n^c 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Ð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 literal 1028992 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®<%~;16U<@*b7+VH;}GL0qw#lIK3R+|MjvAdV>M%tv4e3l z<95cKjDw7?G9G7?c5uBIos3?_V#Z3w0Am|t7vm1bLB_+3M;J#KPcu3m)AIE)`WW*W z%Ngq!TNyVoZe{FYJivIE@fhPMqqUdi%9z9GV=QB=W?aMA!Pw2XopB%IAfw87oYDL^ z%azf~SjpJJ*v9w(<2J@9<3Yxwj3bPuom%=f#%#u1Mn7XYV~DYpaSP*C#$AjD7>5{- zF&clbeKQwGddaFjKz$lj6uc_V+-SE z#x0BwFz#gB#TaFLm2rsiD5HcwJRrtHMiZlx(Z!g}SjqLq0xm}MpnL`#n(iXRWvK&%xFmF#5Eq+<2ywaT7$Ghz zjS}J#k`d_`aN)~Ehy&IVLR>7WCd8rc8bTb-b`atMNjD)bl5Ho%rKp{Rxcp0G#odHB^vxk$jB`9f zT#WD%-iE(DK!^k5d_o);7Zc*5O9>$^Lih=Bk*Smr2m57&mADH-ScN-BgiCN2fDni8 zb%eF}n~a3@IPWLKC9V+RdfeqAY{eZj!VUP_41_qqZX?72cLyO3yEhT;z}YMAMMV*6qx8U?z=OW%ExRbb>c&p&# zRhLUVD0nt;AMr}TDQI0Walha>#Qns5f>YGGGU9H*y~HbtI|TO;uOn_1JfC=wxFk3w zUDrZ<ka~Rb2=1LBUIjcM*>YPFdG&A>Jc66jQ3}Cf+T0CGl;p$5FaA$5WJPRO57@V z8}Sk1lHeW0M~RPoLiOK7obG524+-8yoUS|$4+_4SI9)FtjtahoI9=f!?h*U};&kn7 zxLfdU;&kP3xJ&S@#NEVO1>Z(Imv~U{?Zkb=D+TW%UQFCC_zvQJ;y%H55-%g}7JL`+ zO5zT|qr~foTLs@oJV;y;oJ3pKLVV;j)&C&zR^mf~lc?)Dhz|;Wn0OcQsNf{}x-GxyH}P)4hlp<@-X-`^;yuJ$1*fK|+ethKzSuLiNFG?A=KKNolM0QkEoVugNv$ns z8_pk#>`#+N)Z0-$dGzadRP4P~erfTd&T8jKdsNPMnk<{6?T0Lz_q0VrCQr2OP-s!? zwzflIzXCr+k_TpnB?L25PEz2rpE0`Xd=!p)~m73JjTZd2wPm0OLS#_MVoTUu?N%@97U zEY4C2vNjssxyI??0j0p9*m{&AhhpqO_LDrKdeNA@{ZQzaa;eiO8=dNnFyrk}RNc}W zZI6b&Qy6Z~LY#b*N;BWs*S$#UO|D6JAU zwx6)H(VZ*^$E++eT6))-kf%xU*&{<)llG$_zWWS(;Uu4oyq+F8X;97%P4Prq?>0-8 z@9ARdfb2VFLkN+R=~M&ZyE)pr#%Yo|`a5QuLX!vZ*Zl@&Pm*G;kM|pqp>RouOM2|w zkN2D4f)Ht;3BtvQ@3gjOHqM?BN{<|HME-8=m_2#p>}jEl$k3-TI2k%-Pea+Rdlr8! z`DyD|iPJbta?qQL)J1JSq=cM~kWGHEH4lHoa8_*e$`?1hj!-wn(mc=XM}?881T>MV z0F4;yCE4s$Z~D0b(hg0MKd|(EP&+A@hUDyb?7ej{R2Huzk-KeDIA6(yq|BDxvoH6l z-#|x$dOi)6dOlUD$m&iT zZL}d zQ0NgVMS}icNWCvYrAEX8^*uwn6dAC_qDaf3b+3NzhyyZ|{;j`oe za*5NXW~AZIMGl}!Hf2^xA8Aczi$O8St4q{79}oh_g!t{U72jF1--yVjK0AU@DLzCg zbb+J8L)3+1sO5p>+*L` zx1!;#8^O~9&Jxn|eCM_8W0p3$r>W#WMorujS?`oWUw{zI$^wUMbW+F$&&?X&+^3lyjWO*Q~a|V`I_vk)d>NT6i)Q<%BQW5za(cwMwCjHlh?UBfhT{ z$2vWr_rlYT!I#}cCI$a zEhRAvw8d52Q8W$qOIdSomJ)zyU>*ACPOD{i!R06)6%#SdYUN3Y`fc$lW2hi+gm=lP z=?AjvIiWUUSZ`f>wiLEPj()@WCn9fs8W}J~o;S!NNYxlQV1h@f)R#}G7mUawkpmR8 zj0n;#MpmR{J|qb+tMB4Z4C2Lw0Z0m8gg4R7h%BK?Vo>2=AAe+!5^|Zme1XFzzu!?} zeGeMoCOxJxLLOMC&cT)E4SP4v7o)@oqBtzOXE~L#YTKhNS1*s+(`TWppuMO&n>!=2 z;nOiu`w7TNy(_~g_0ivIj$PClc`V^Y!Qp+2@W%3pVrUv^Cc_2IG@)(Cf;5_iQd%(x z>?NDEP~AD53UqQF7pTS58F}iAlt+z5O4Ou$i+)ytypW`sk^~AXC6D&eEJ(ff(==hB zD18`3)P4}gaE&ut*|`r2fi!GNoe2(R2p!`@+l@$1!8i;_WWzEj>&*Q_#`IZMaNEWO z(=dEzDtDF0A*Z!azKgUa4gY?Ykof`=6@%`QD?W^6#ag4-)ZdmGrOqNl z-_7tr&Q`75T6tA<^J(Z3EJ)unO+><-`?ajjS3{b=qwi{p9&(CI@G8Z_s4t!nNx1sx zK6-KxvLPyJ=~RD%ASfhRVtd~t3I+q5NWp?kFwEz{hAX!kn+JKoT~Ue!PMgGr9=Ahj(K73KbI_Ow+azxMQw| z3~A&Rb`Jqn*9jhkuSaZ$=Y*1*hoY^!QaKOYq)xik2=f`9D3bP}>pf;uZnbVKGDr5? zI*ii`V=p2XtE?twPCc;BXx2*P;6{u3@Lmn{0_%VdU=Wz4lsZFrZ)vAq?1HTdAVv;+ zvcnVATePMk4=63fNng22kzF1AFik=S$)RdGS6_&4vVV>~`c00d*Jqa@@=^5=tRd<` zy5qB9MtLb-ox;jDHaffW zF3bz4*Fl4eJ7x(R9oj&>E{ob0GmXAWP^8X$gF(yWCS!tcA!zkkCS|cb?`c-{#YQ;41Lvzu zG#Oq%rjPW{rMB$DVr3SYF27IldGq?ws@dzUFitMRvsWIF7y0BuZ)_Th?owu#UYp z8s!Rn6v}0 z4*4WTWVa&Cq)`xFmiBFkB-+c;PCsyf*gPjtA+)3qbD|7-=)rkA_-OdZTQELif!>>gt;Jsbw_lu$ZkwVeF>} z=_KW$(7HV#3n-6LKT`)ZJDUZ8e4-s4b`3|-exD;rSOw%Da`HMuL&3Ezc=@K@+Pvhx7hu&}4KaUEr9xnMOL?O8v3)^WlWc1dDK?Yx@pM4rEH)?us+Q1AMn|!HFEmaQXRB< zITFUCos4n`WL#vAyg$~GsrW0g%$%UCa>zLwmBo&^vY(1bU9l2*S0fP`>HYF3tfDa2 z!?TfuSduSPms~}&iiZlttl}`@*f8$}WGS<=(`P$SptfHj0W5AjWEoA$Y%$E~4SNCk zA+*}~9_AB~)8S9Yl&}i{?Rjgn*EL7hnWdIxSYC*=MMfmo5TdD>9RaAdXu+g@`3n5G z`$92EiFqSYQy&Qv9^|jSa1yg2WJ^Lll_X51(2O8`U)Hm)M2(7QJ<@@yW@{^F`AyoP zh#Vb()1cBs)C^MCm%I6QXcvMw=80Ab<(FB;-SdM*#t56y1ShqQCqK zJs!(h%HQ&M;q;^eT#EgZTE*-iUxwP`LcBsrV%kI*$2vP}Mn!vK?k4Z2*;`auW$L`Q z4zfch%2JwKsHt-x&4AoB=cAxDaE$-XF_F4kx%hZ zCQ6YvZvdvU)M>kN#PES!WALVi!fC_PmksTb;8FSY{zn zm+md+{{Z_<#uL6YM`%4n?0E*ov%{vluvC98@1wPL%!+KwpSB?_dx2szz-+$uHKPO;6O$`N7mL1wBJV}qDJcb0>0pv zrJh9f;3_r)P#zJdfEq~e&3#zZXhDAigFtcQ_bt6IVqn1}lGYAc@s%jacvQ}Ds?~2m zEwQ#04(cMXnXA0(XklxUS9#?kABydeLSKe3XhP$F)l&-X3B$Ki7(VjETL|59(HKl1 zB=E@VI3$4HN1nD0PsR*XR3F6`dWh9GYO7aKhB3KPFZ!h;LIqJg&pT=@5QAilXJIBlnNpP_SowKsK%&z9fgNMXdeqXM2QO>*j&lmj~NP2$JaQs ziZOe^q5=KZC#I@s&o>vdsp>f~JDbdkQ!~W5p>vhFCiG0p##!2$Ka`=&vBlm|)|!L3SAJh7pFQnI8i!Lcs(_}H#C8)S86GpQC8ZD zhG(EsuzHD^eV0PHV@9oQ)8s0#JT746mcBPv7CC9*w#tJuJsrfd?~VXIOu z&aU0>!||3Vvezl5jtJ{eGg0JW91ZFPP>P}D;VV6dItz{H#y(kVNaU;!TqW|$5J|E8 z$#6IFjCY6Us5|Ua3XG_INv+}yT6XV8Zl>glV2X?ekh%2rZ$l_B&a7n^9pLQ_osATIwQ`F?_GjZ2lYbgz#!J5N30?BpB!WWqu`7h=i4|KO_u&M=^6d(0 z1ylr;(RvZg%`}o5DX>;g^~qj6A*~5lXz4gRLry=e{KvniJG?*@ja<4uY-7n^% zZKBV_r=ynML?;=2TP*u0V#n$y@1Te4`e*$D2o|ku1#^^y6?_3hE4DZ=^-Wm8Aa!dT z%^b!eb;I6syka(bOmQoVtjaAmOmAnkuDd}BO=!K_B!$lJyuV~UcH3Znv0bWulx38} zyeW3EJgDA#u?dG!*8M(VK909=8V$QTsT_!TyHq#=}9C53Y z&UDedUa_rLjyJ!h_wl!&peKA6m@I8qU^`E_B_D;k5>q7^=PHn~n`Da(-ZIaLyyw?m zAdk?dSdn$6-yF&;j2)v8(I-d7VkT&`8^b}FJc30d(xx_cBQVl|u>tWbKC5CRl_bq6 zS6Zx{5pSBAHPN`iO{vmDw`(?_3L~P zah1~jPUU86#QPm-HO&CZExYG9^PUY)h^)m)NV+ffG7|8%?xYGs#vs`^RX}oh^Q&$w zw@|dQ7){@^#mv=6`3i5Z`knQYg*QgnGAT@3hE6Gb&G2z3dnd|?K>(3ya$E*liFYck zSN+koVmoJWnEvztl?Ra^dW;$AMK&KC zO7m9P)=`m56Wc2Vru6)eonm)|f~)x|R?x3NenvF-m{4m=ZxP%5GW9Ze53is(F-ndT z04(k?Wh!#Y+Bndu0Xch~!AP(Mmg)of1xS?E|GvByj0$vQ3sQ~-&$sOMIrEH9g(vPe zK1KP#-5=SBs}QipZL_q1WeUtL1S951Vh!E`yC0hZw=#+kf|EyLn3}`LL6EdHRV;Sb zN@+G?wBpc*M$ZjdC^^E=l)#2?G(j%~H-np~&eSiIZ&{JCjC05DQ$Zr51`!e|hSx;a z+0xceg!tW3h_q2lfaU~9o)b28-tSrk)r2iU4@5~y)yDIM{V7GLlGruzc${(P{r&0V z!{0>VwOxqP{j<#UH%VgG{E|+&LsxKY8o$Zbiu5f>=_5Re&vPg;nub&4qTvYE+49Sz zUKo?osFv_1{lIe7foj6Xjm*62GqiTb%b2e?vKFRfCQWo`YOc+H@_|&(O3E2nCW{G> zjoJ+jO$w}~(@mo{mNAro`CmwYiaRcW3M7Ekg2=?L{toBx%6jAQIhb_ApBo zb;8!pxW<){A$SmpwV%+t|9;Jr>Kit-uD9bV;$4u## z%ClS{)W0e0&71G*DPo14?c` zKMEOX!xYpnf~SFI>qn8IrMJ+8qXsMHYZ{x>PP2)&ZZL{3DGk<8Mf*FU+mVD;Dq8=* z{-C<%nWnXQP%fWmY&m>w>9b8r(3rQ@xb7mTD(wX;#!(sL#3Kb_oJcQ_cSY&-0tZAK)cl$?vjGBBQg?F`UDO z4wg~Vn-b)Q;@Q>xy_1nf`1#loP#cEi#AXeR|F8oX|8w*qnXXA8g&cVhdg1T9g?3+R z{)YcP6P*|C0bF0e;9H~(so9WB02+MlL~W!D--s-7P?G>A8`;8ER$F@WzjD6Zk4OcG zU*7&qr|~JgxD|hvrR@of@VJ-KPX9@1>{4_hR4V{qh|H>$->*JiM=}Wi*D(FhrJb5O z(p(0?OiBGDK;cnjv12L5>7!jRQPk+caMoRQjtlvGpVlLVM#U7H(5XzpEv@By?D8gO zlu{Z%p?nm({TT%Zd`89QmNz?lDD`Rbf!17H;PBxB$AQbxsC0iLDhjwy^B;`+561mb zwjJ>8yAWTUZ6YPMCdkQ%wf0rmQNwGQ7Gj4eh8_Z%ju0j-L}}+HAqf!>ra|AB7Msn* z>Knh*1}_;?N_h6&jSLZa`J-^AK}DNsV&9wATWTqs;RK&b1^cV&z6;YNoV^!OQ7SEM z0~8s#i@fyGjH>I9N208n)OBC2Hsx9=M0QD~c=I<}#Lr0cDlJAaL{AY&PI{7~Y9?if zb%v;nCXF8u7LV#-ZZ zp=$N2{RSy^A^L(C-#LfA8l;cbx=2eF&62B3R3Cj2br4e`Jvd52x=1;Xs?wVV+8U}G zenJ~_tJP~>61^sXTyb+HWS2+c8aaY?b8V=0x=3+_P>^OB(!yNzF?^$Ju0C8Uqs~O? z+!?XZ#9dgtYFSfDwLv@C+#fRHLQWbA6Gcc&q{YxB>Vsse)x~twc#17b9V#*b|9dOi ztP+($8{@4GnP(v`*#ZnK0>vl-Ze=cp1aPtRlQD%FRp%ic(m%LXQYd6mjnrHl?|mDr zbHUB9iKPRAkTl=>rZ|YD)k&SD?Ewk`n?Rc?{;Wu}L@sj6^K-CxDRq{AxD~BcP2B-4 zB1X><)$x05RIGvJpfkau+=Ry~y_nS$dEs7`aQq-jj@b}E2~5rnkcn6wqo}%Ia@3#x z0$PIr*tw18(uZ}QTx5>X#I{^i3I%~3Ev3SAe2XfE6=2)hkRWElcwMc%=Hm5J?G+0$ z^>0pe;B{U@xDq9(qazPY$grnD_oJ$@mA%NO`Y7}wI|MU8Z!2-m7&;rH+o*auB8!)I z4j~R1OO9k#ry!{CIs~ub4y1{)6?i9vCU_@>ro`;Xt$aXQ6+4%PGhE~nbcL|MaBl$j zbAsh$UkuoL^X1E{jB=q(E~MCQY_OakjYJzd3QaNUCRbpl1X*Y^0!WXNkhM*`G^!Hq zYn`)mGQ9+}vxLC#z-ZEhMY|)3VYyr3v2BOgmm^QEsvG?-FOV>brkJVdwP5F-1{yI2XWH%s9f zgl-X4(c2K=H2b5f7Y>h&L50huzCt8`S(`kd&Dr#@R8{p6{4b>P2rdPmuV;ZJf;jjU z-rhmj6ippMv|LD(4b7`(rZ+J)=PxjE*YpDGaLCw3k#yaF1hMd=Xw)PyX5z2!@4Nx#6df1g)zkCJvwehf2rh+>4mB_ljg7suEcDAt20Cs;T>WcgZ=59 zNE)f_5(5$S9@2n(Y;*Zc9VO0Y`6SK%?!wHFItO;o;21=RGK6%BjgM?~KgkFbRdHK( z7hg`>wxP@Es9+EJzh&d>_!+@1I3ut;K6^S6D@Kgcm=%@8e?2cMTMVF$*X;n$2~r|j zZI{dYNnSy^766(f4hT8}h(kNl*hy-;4e!gJw<`rk!vRaLA6s*lwgR}Jaf6d_2#t-2 zSVrX3ajg=Vgw964nOl?>Cc899|6njJZ1w6y<1E6gr{ zEVhb_V)q7hbgJKn5g2}h0^pclxkulb+|x(RCblOFjHqI+VkA3+lM50L?#9J0{6$vk%_c>W6E^At+L#`(wGv0=hqj?Pr_V2t_u< z$^tqLDl8h_h}9$FxRpA4`#a%lVf2cn@DxZlA9B15f=1RMl#;NHF+ey>|6?*@mYwjO z?+DY*d^X08aydv#1h02;D8te_63cjsmEA>gpjtUla4MuLuRvP&9lFtU`3q?h3g@!n zjxJ0)9jMx9d^MUVhPZ;7t$v{gd&gMy(0n8pGqyG-wVmGg5Lmm&GpZhe8Hvq7LQ1{~ zM}Xl8$O~6iNKbxGMS+%}L8vis-%-?xvcVlsT4ZO-IO3qc!i`eosNcZ5+B~c-mWfLdv1brYw4V z)bNEw=%Ne8$8X}@t={mG7;GCnQOGkJhdg9HlplybdB~Fg%E0XN3}`Dee70$&2Qz_D zU67mj3++HVIver$v=zmpMy65KjX^#9u~v3+j;$rf2yOf?7r7=MPMl|e+(cFoH(pt0 zNLo}7N&W1Nq@<=J$Y&`kD(6(cbV!_S3xSClCD}b10Gyw#bs>0Qh8ypZ+UYZ^Vd$&q zeNL3)3?;yPb1$t;(2sE_0((%W%p-eH>a2r3z`ZuaE2gQYxKrvz5+%^+F(pXK*iCYx zO^tZ1@$&>&b-1EcX8iQEgOWW-!6*X zk5c5&O$d0E;4&%1f;Sp5jM~jJQMq3|i_kQwf6;@5g_wCHT{+u@)u%Y)ep|~aTm4l( z{+e?L8*`iUolTkrnF?rv^5kj9dWY=YC_M3opq-29qQmgdU^&IG?VTK^OZxe7vsOUM zxBR}ZXpJ=;gy!2c(!(B$sgMzvt5wIT#!!6>`NdFP>iH-LZcLJP!O*RzX=gT4r?r*$ z%2C59d4W%!<&9kew`|g=cMiECBHWpqlKQDetfdDQ`0ZJq;x>a(XJ`}AwR)d(d7Q=yV;dJP1 z33L{6@YgEYEy`Tne7GeCCvAgkC)Li(o)wzli+zZD09%l)xCoI{Gfg>7;;MR)dIQQF z+m3Yo!}FltocK5Bu++8_v9i@8INYS)bnQ0ZZFzi=Xu-MgsLVShgki}KIDM7^l*BNa zPB)t&98}Osw|B4*G0M2zNcBd5B6Sz#_G9F>25$K{^jU+i^mSK7MvdVcP~Fe9jMJWj zXdk6!61Q~7cx0=0q^C>6KZ2uZ|AbKnEgSHiXTZX$2!jpTKw*o4x-A?x*gT9A1jK2P zjr400D_*@oGiJ-%sFkozYyvld3*%nuq@VYU8$jSK1`biI8{SXYd!+SG`VsX=(U*K$ zU!tx_T~wx@1*m^`^0T`q6oooL-X5F;Qwr!5T7(~QgtMtA!ddibFZJn_Htg`{7{{RH z!wYbgQH&ip+JL!7=sMpSSD#1JAH!&CV?+o#Am)ttDI6W1Cyf!>MiN{CvKtGIO%R$m zd%*t@qPBx<*gKFV4j$Cbh!K4Oa#r8iBd+7yZ{Ldm@y|l_R=jW6`~C6Zwf^SN+mGVk z6OZ4C-;iT#Xg7T?RB8UaVecX>KK4(wV5ZymcJW8aawf9G4*?dc7@o&A?7dWratx9n z(Yk35=6g^VT3&Pl$@WBE-yP|1wY0UP5*uK1B%r0e0=`gh>;8L2koiO_rVpMj!lOHW`f0Z*~CaetDQ!x2a^!EO@QA-EilbW zXj0Y$_qs{&Gf~(#tq3v2^BnkOE!=bRohG0^Y3|jOQO;r9? zloctP&uC8)c52-MLbV z?6;CDq8rH#KM#DaUqy*t?0?6qY`*{K$xp^MydjNIHQFLaKl)_MGid33iG1GqWK70A z^tUa&Z*QPmS!1~M^~llpKcQ)bdBdB?b8N=ui?_atDA~>#MyF>G9!Ad|^j4GSrO1HM zgCk>HAhpViZE~Yso}XoDZ-62WUxY7FuPD;Mx)kTpTAj?`!#@W_xuK-g14W_rUV%DN z-C`m5TY3jO*E>X2P*#*%*%6__$p`vX>xQ?ebe3M#gCC}TM8!sBsK}@T(%A7kQSG;= z+Mah&UbE+e8H-2c#nu^%kE66R7LUq{?K9|nAHP5*?V;&5DyPiPf_*U>XS7{F^_HLQ zf7_0(Dr1#ScSWtrCWTVA^lC-g@Vdz1S&t2Uj`?!|&lW2YM8~o1DhoX!wC7X~iz+ zQX1)ZM<&llo$Kv#qjd(RV2w6h@p?|Hj}3#@_$pa?%}!M7bE=}4(aunif1xUaR1Lf5 zBh2+y2`PHsrMfueVY$(P3R&7KNgFI$d+$VL#)geVgtglVIyQV9V=Uy8^bz*#Z2V4k z!`_AG36pyiRi`O3Z8{k7PMbO=83xpVP_S_wndqd-56E)iB%mB~^xMy!Hut*CR)VNt@oGfcOW!g>O6*0>6$>+kbcTO~eTrJ#Qo3_bFYZ^diO4 z)bRgv%BDohei-Qg%cRXoNy8xi-zAN7{bp#knN}_4yl+$UTfV&xS|+Tk_Pc+$34Pjw z-T4iB)6Wt5G=v^c^AlPqcwrp8SYBYPn@4*nHcRgWj5{`K|B&4yXkl9akZDF5#uDb~ zj7AF5kGK;kz--8E(Imkq_P=2jFD44H2O%a?h$2*fomucH{eRayGW&90@?f<)J z##*zbccsNM>KRcU6WWaH1JEkti@58IGShF+=)SK>eph~On6|NmKEsMB+0>)46{Bo= zLYVdU`ror6ri}*x4{jl&!e(rZ_Tt~m%2e`zjheCf2{9zlE#Qy!M8S56j)D|S+R%?S#xCqtE@oBm5^&lLmi9+s zo*@M*4Vk2Qs7e;9hp{+rYyO^*PTfWmj5fG=o~5RJPT3(OfYw3LF+z(uhZqfMaK zO>2ZWE`z}u>zFqwxh#vOP-7qJm^V3I4rGj)k|`O+Y{JsJPl4*kg-j`;UtK2VCI>uw zW-K<#gB^=3$iJfyub4k|6lM~dItr(DRy!TM)IsKKFTabw5V2wJA1yrohOjqFhXXYF z1)RBYdr5gupv3_hIwDENQqXkG_5T-BX@7AIPW8w{hG5O!g-t|99-aU*sg3*S7Z|#& zY$&%sK_f7ARrJ#t+wZ4=m^(_`pwZw98->Bw(hF1Oc}dcY=$J@Crmn9? zH=!SseNC~9iG<)|q&eUsBf7enHj?#&aU;7ZrUXxDQ-V(@d5X6yB1V7AmOZD?f-@Gu zww&z5Hm1mZ1}q|#9DUZ(`w3|z6oclVdTfPadq!agExlNdqlegG4E3_3oMg9<0+|+h zKV)I)eV%%L+-y-#r*gomQc6@*>fm-|-3Y~jO-v+);X+SLGp^{H{~$54f1=$Rf}Qz9iq?)GKKV+oYKTB@_nuob;Te^@d=4P-a<7^;`F-0?fSBoHGfT2|i{e>Y& zLTeH9JF(!`8^eUv*5HgHv%IIH&_Y#MgjZ-($D&L^Q^z8*eerpsFn(nJ=r?2w)h?XK zZ`k|dWbF=RwX+9zLi$%&jghrk220yASd}~+#}(KuZ3?YE)>8oT{z! z;jgT<rNvJ+GlerY3Kkh#C6GqBb{k8<{B}>kmntr;Wx>cYWU3XrX!7P zx$v|+iVE|r;Wn(~aJf^t*-odO<_!bjmj1VJDI+~>QqGmng1M6yATg7?z@(rV7MSV6 zviPGXxU)}Q$N^sXUG6Nie(jg{J#;bugv5L+i5V9jv3F@{`xHC&=jU>16iABVYcfEYGan-Ng(}j9g-Dd%!c@0h8Q8fB}fyp4eTM&lN3L+te=2@ zbjRI@J`ZWC4`YB#$T3^d<>-pbkp=a6a%3^b!&DB5J% zf*o=he?o1pNuF;~ZZXS?Nr;O{h;|5ZxRXBBoGjcVrMi-% z_+`3KK=C_hAuhia=cwAPX(db*&B70++&~&pX%Uhozo@O-m2*2+S}}dcuZoTXa!5sJ zZm{Syz^g2xpEUd62VKd*Yd)zW!hm||LVYP6%bg}^!h_05`U#8e#t=Y1j3`mRiDOHM zHhTt=lSQiZXGMIdrvv^Dyi=OA8}Gz>@eIVBp=}V*v6O2DO;V6fWQElr&l`~okIU<* zgxF7+1*ziRIVyuDFNdCl?RdeNm(Tz-^^!jb4`{@ay?FZ*l%OB@0x1Cd?g2ld`3Fcb z3az@nik^-?L1Tyf=_f`CsoE_j1wZ~?nFUp{QGhu{YC00@dYkBWa9a;u_KMXUekNyW z_<*F38&kB6j~|yqd1IH*ei?O8(pYk5b0SiuFuAps#%IACN{bOmP$5r(;`GS`oklH} zJP%4%#jLcLL0QH7xgp3{?B&MLECqtQ)aVGBg7QOCL9WG+a|x1u1DT#9=%KQIL@quqx16R%V7U*r0%m0zl6;n2wQ$-_^;SQqS~RPHpq@7r=fkvPom;qb>oB+H9I1#uINbyU7lYqAZCj%D&rvMiN&A>8X zCh#_Fd{1@fJHJlnsdl{Fj(X;xz9z8-)=ntZ`(Z+{d~g>)JcR~#0k&WY)7%A^;1s62 z3$WxXG`b5g-zv;-7vO}U5Fs%KDV*poz{;%9_cfzi&u0!&&D7 zuL7P2yc%c+W&_U$ehGL1@EYKSz-xh7z#D-V0kJVP>tf(nfR_Mo67m$rnEq%@RtHRf z?0Oz2LFkXHxG7u&TL&tX?JFQRcH;LO6!A(#bkjoGMN_UUWh!_HZcPCE*mwbyD)VU7 zUnacDHLps|s~TQzC?6UV+JPz|Tph?QG%-fa(CW}Glm{=uO?Zjx6Z9%q#!he%&MPgw z6H#5L`UHdk;Hv`)Q$&9`5G?@}6Ns-4+U_e#gF9LcIwufc9feT7qI9^U1)+oj@zqfX zZ7edv9ioF)3dC0ju3YpMWx)MPxM#o}h_8-9=xfmgxTEEvw*v9iQAp*XQbH4;$O7@z zQ3#DLGQl010nHYOFWg6l`y{wSQ=sYs@zqfXoiCaUcW4fDUm(6Z3egFQrobJVgw7xk zUmb;_S6F%*&7P;B7=>m_@BGZ^^D;Z;p>r&rI(^YpOokDa?md*ldSYsGyS}db8$D)FnzJ1V-ecRpEiAQTF0XQN89_yM^#*n z|9g{#Y;fTQTp?;&qDD;=ZKAYgC2Bwt&_=*iN};gYyhFV0TO6l3!5tY)BwZ~OTztsjSrN3%NR@PCQ+EJBt z^i-``Nj(aL|CZgv5*#P+SnAp^TO0{G(?6h#icLb9%pR1<%$>+&PLs)u>4Ry^?xZi{ zQ%a5g_)V2|PbRRaO|WnG#v8kxaZHLc9rlW{=wQSwYYw6$mK<|kQRO&LV^r2_&s5fH zw^Y{C&e{ITdhL+PdhLzMdhLqJdfGWVP+6~?P+6}%P+70&udG+xSJo@yE9({OmG!i< z#;k-WW$}>By(}Q;`<%t%3<`Xef;ppdx{K=RE~=-ysK$|mpnAHC>gg`3r@N>YK|H9Q z?xK3Si|Xkvs;9fCp6;T0x{GS9f~dnUp(?W#(XO_b#rIW$Vh_1SFNa0FjEg5gc={jk zC8=|EA9KK!inE+FCmKE&<%>7(`S8O5In*CK&X@ClvT*({2^N;6C?czBB+HMV?^2s7 z&rd4ikI_C5{ef3rm;7V@m;7t@Wb^0L3WB0mpywsuQ4lZviz+-&_N-9PLnz0<1jWi0 z@}M3QcwH%Am&^+#Z! zhJ@OkC}NeHu^&jnSea-Rii*RR91wAR<5aZ%6_G)QU%CS)&oRDdx>H9aD`1(n&dFZf?u_Z#MD zX&rfddNl9t;~vkIr1he3S)m6@6S{-Wf|p*4x?G#BD>!uNI@^4qZI>>^W)r$pKLnpZh@z_hzjjp(Glq1PH1_|C5QQq3 z2ENN%x43|wcT~f)6Oj$IWHvgpfECB6(@zLjhODXEl)`j+yX`B=-=!L8?kRIeafOQnqY? zMOVJGFlokaAR!$ihfI=Lw!E^N7Zu&Iq4~2t@j2~5deR`#Xm|Tx7KW{9C|NdwxKiGW z8)Vle2h}ANq&iVjd3|p_&|?^fB|U|Rd^V){IF1Oji#aM^5&1$M8SJ8}Ew@ADRC@wi zy=CTIB57ErZZ7#QHKS3tkxE%-gN2j9LOwCa)97q%WN=Vs&}Ic4?<4l$wiPkW7jAUo$3)o@&cekTkZ+yXcx}2I^y#dzs7{S5c!%5H~S>0AS45 z6e)PlRzWXcA#f6bf?yG*m8CyRQv}vz5OLd>=zwqeNiY@H+TGW<#MfuJ|b`^6E!dOT}{99(8r{o^fBpG-6RE8OEI;SlI|rZR%C^Ch!U!g%`q?a zSxvS4kv5{%s^oxTzd`$qi zsh3?!7>Zi$V_m<`(=4~SSzdO2(=`TGZaR)$kA$9a}8yT^&XEKgK2*v}^h z#wVkaR(`2R83*)cF@qx@L!1;MT9u`7;1wsT`Kid+GF-F-`;P(({JP#UTrl%eKc}kA zo8Iou)xT6}BlOX}kQ|5;k-Kk?CJdW>#CfT&XzmBe-P|t|-10he-DPY^9zWmzwf=$V z8y!tYnj+=#xq05aZ*Ldvtvd#y8;!)E|Q&1ipP!^rjzVR;yWIF(<- ze)x1B+DjMuP;Rx}!h!$p{tNqw#~CytKFK zFn;BWGBcGwW18tSxGd(P@R8dtXzJS#pF(Bl7|Zw4Car8d5P3}orgvTv@E zb(7Vtxg#5MrP7~z7sv+;ss?l2B)hlzOl!1x&q}FFZ}l~i>o$CWSM^7W8J8>v9BeJe z-PhQGDBs}0VHSLaTUGW`6aVl@ngt<0Wp=_QjR1aOd<-#0n?H3iMAp&~XKz2P4<~iE zHC-(GnBJl5b-c#F1w^E`qSt<|8O!j2i{p>UFNB~El@lj>z4ajjY=Ya(ka&+#BEjkGrv=wB$LrLC_UO;^HSToqz$IqhQ|Rd z%i%)I3TepoNllxqK{$_iJ~m#3^!wK5^Hq@wCs&m=RS)+?PO`C(^2V(O6vS)t!pX*e z+AmaX3HO@!CgRh|Ka9R9j(o**ipj{>368{j7y~hUa5;iFWDi}3W5-Jy46BO5OESkp z|HniW8~x#J%l2u@W)AJ2>T}GPkLp#Q4d4kfe9TxS-&I?x@l}pH44=yt~#Ea}Mb&H|=qmD=!4GWdGqEi%L2^*sF@?LEc3>mb2+he`as>a#uj?A}D*aM;sBW>NI+2O!#wH|>~6Gs3&9 z34}Qh5cZ@bJ!D>;pm@8tC!NhRm^ShT{sPR{TFz`R~>Ns2VI*G6E+KrQeqQpi7ZtU81}Y()rQik@g*}j=q?czmkH>1xo0%sLIU(Z7PW2MF0a*?qwab&z9U4z2sXnHfB zaTQG(nBf(htD7mqY-jK#yq5T_tFyGQ^5In%+DGgUGvl)RpP>ZqwT{`gUn;dfR8Yo2CC0BW7kn|boc9!b}ctHKoj;ga4*J84uboW^68$W3Jnnt*sfGN(y?WlDTD~*}jphs6;o6Q;*CU@sJ&# zIlC)9@!W8axq29dnC(M`D9CIfbMp}sZGlxgo-E?Q(zBfPnDR=fpwAHh`Q&a!HEnP^R8F;N`FV- zxnuUjbUhz3t_2m8I{~B(xG4F9knOtR=|jw>G9>PWmNTo5C8Kny09da1Go6D7{S)<< zIjDW}All{uG27ATQj=okh-`l~hyhs{^aN#%5Hd>Uh)O6*=&4VrNvJAEQLIW!=p?tk zAAE$Y%$Q75*%BLrEB_~3+Vbzqpport<|KDCN?mgkDZTVVavIy9Hl?yR^d2)Mhx89< zFqjGm&GU2xY2HR_=Y2t6&+CO7tzhPA7cR@z74(cU1fP^^(ofhDyRJKq0xA*~8AQTM ztOPRi5TJj1Y!^HueU=_T^`?gjh>di}$4e;POGxv;m4cRU-6!PK`&9aWoO9jDFYlC+iPAmQMnx4;qLvpb{ zeG7LI99!;n%*ofebFzArV)T-~Qs?HD{btKIL0I}x{&<5yZ~SwKYc?omen`JhMVTmf z91HsDt?9*7=h)!uHmB#f#+d^lE^4siw`sO(gaxNA#@hoteSs3pZhL zZXR2wV=>1-bgmlTR9)bUoCpIEbo)uam4E2;_=oNx{Da);F~JalNC+Y<7tTywa|rzc z8X0=HXW6*)>(Gif@5ZagF@Z&25b9aS!3M+lI9-z>ZwbqACApMkC?z*6Lz8@0+8;(v zV^D>L@b~d0C-}lIn9+L_P%Vk9cg*(gXsWWhklj?VdDlu}7$HGBZ6ugb#hAWCfL3+j zc#EN5wV#<`V#brwnCmWrl|N8vwjZRVpg{t08KJNms-Kkcb93K_o;N_DAIl+j03yxo zrk_KJzVZ3^5FsMk(FIz9T@JnCzdVy1$tl1;3O0i^h(qIC!k1Gs$71{;isU0 zM!A3TDZ-nGD6@y#T*${9&DLa$GqDUx2`Q^+-nE)E;R9w&&Id>;YFj1Y9*u1L8ugxl zi0{U#9pN6%x9<)M0+7~ZM2#%kH@fjtX8YqO9f2oi^J2Ce#*vEdxWCEhz(&2(`a4b^ zR;@4k?j*blv`Tf|(qmn`X2&B-LG@66&;AhnmXbi`u3~xG6NG!np`6;4 zwy>m}M0MfAF)J~p9W^xhR#Y_gRYs1JVq||&Y4wuX zY~LE)SIOGc)K_TU6$6Sb#vEq*QUh

    uQYXyOoG2?Ih$0DdDK0nshgl&hg7|_OlC3 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

    &&Ho+@ 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