@mentra/bluetooth-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +278 -0
- package/android/build.gradle +167 -0
- package/android/lc3Lib/CMakeLists.txt +6 -0
- package/android/lc3Lib/build.gradle +109 -0
- package/android/lc3Lib/proguard-rules.pro +33 -0
- package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
- package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
- package/android/lc3Lib/src/main/java/com/mentra/lc3Lib/Lc3Cpp.java +38 -0
- package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
- package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
- package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
- package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
- package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
- package/android/settings.gradle +1 -0
- package/android/src/main/AndroidManifest.xml +40 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/BluetoothSdkModule.kt +528 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/Bridge.kt +610 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/DeviceManager.kt +1616 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/DeviceStore.kt +314 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothModels.kt +1710 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothSdk.kt +554 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/ObservableStore.kt +68 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/controllers/ControllerManager.kt +158 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/controllers/R1.kt +934 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/services/Foreground.kt +175 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/services/PhoneMic.kt +1109 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G1.java +3974 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G2.kt +3551 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Mach1.java +1327 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraLive.java +6959 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraNex.kt +1655 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraosBle.java +53675 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/SGCManager.kt +202 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Simulated.kt +224 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/stt/STTTools.kt +340 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +465 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/stt/VadGateSpeechPolicy.kt +221 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/AES.java +106 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/BlePhotoUploadService.java +179 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/Constants.kt +44 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/G1Text.kt +436 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleUploadService.java +76 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/K900ProtocolUtils.java +791 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/MessageChunker.java +186 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/NexSGCUtils.kt +589 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/PhoneAudioMonitor.kt +303 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
- package/android/src/main/res/values/strings.xml +4 -0
- package/app.plugin.js +1 -0
- package/build/BluetoothSdk.types.d.ts +498 -0
- package/build/BluetoothSdk.types.d.ts.map +1 -0
- package/build/BluetoothSdk.types.js +23 -0
- package/build/BluetoothSdk.types.js.map +1 -0
- package/build/BluetoothSdkModule.d.ts +71 -0
- package/build/BluetoothSdkModule.d.ts.map +1 -0
- package/build/BluetoothSdkModule.js +106 -0
- package/build/BluetoothSdkModule.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +5 -0
- package/build/index.js.map +1 -0
- package/expo-module.config.json +9 -0
- package/ios/BluetoothSdkModule.swift +665 -0
- package/ios/MentraBluetoothSDK.podspec +77 -0
- package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
- package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
- package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
- package/ios/Packages/CoreObjC/attdet.c +92 -0
- package/ios/Packages/CoreObjC/attdet.h +44 -0
- package/ios/Packages/CoreObjC/bits.c +375 -0
- package/ios/Packages/CoreObjC/bits.h +315 -0
- package/ios/Packages/CoreObjC/bwdet.c +129 -0
- package/ios/Packages/CoreObjC/bwdet.h +69 -0
- package/ios/Packages/CoreObjC/common.h +151 -0
- package/ios/Packages/CoreObjC/energy.c +70 -0
- package/ios/Packages/CoreObjC/energy.h +43 -0
- package/ios/Packages/CoreObjC/fastmath.h +158 -0
- package/ios/Packages/CoreObjC/lc3.c +704 -0
- package/ios/Packages/CoreObjC/lc3.h +313 -0
- package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
- package/ios/Packages/CoreObjC/lc3_private.h +163 -0
- package/ios/Packages/CoreObjC/ltpf.c +905 -0
- package/ios/Packages/CoreObjC/ltpf.h +111 -0
- package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
- package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
- package/ios/Packages/CoreObjC/makefile.mk +35 -0
- package/ios/Packages/CoreObjC/mdct.c +469 -0
- package/ios/Packages/CoreObjC/mdct.h +57 -0
- package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
- package/ios/Packages/CoreObjC/meson.build +61 -0
- package/ios/Packages/CoreObjC/plc.c +61 -0
- package/ios/Packages/CoreObjC/plc.h +57 -0
- package/ios/Packages/CoreObjC/rnnoise.h +114 -0
- package/ios/Packages/CoreObjC/sns.c +880 -0
- package/ios/Packages/CoreObjC/sns.h +103 -0
- package/ios/Packages/CoreObjC/spec.c +907 -0
- package/ios/Packages/CoreObjC/spec.h +119 -0
- package/ios/Packages/CoreObjC/tables.c +3457 -0
- package/ios/Packages/CoreObjC/tables.h +94 -0
- package/ios/Packages/CoreObjC/tns.c +457 -0
- package/ios/Packages/CoreObjC/tns.h +99 -0
- package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
- package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
- package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +1659 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/cargs.h +162 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/c-api.h +1852 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/cxx-api.h +674 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +44 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/sherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/sherpa-onnx.a +0 -0
- package/ios/Packages/VAD/Common/VAD/VADQuality.swift +41 -0
- package/ios/Packages/VAD/Common/VAD/VADState.swift +26 -0
- package/ios/Packages/VAD/Common/VAD/VADStrategy.swift +29 -0
- package/ios/Packages/VAD/Common/VAD/VADType.swift +14 -0
- package/ios/Packages/VAD/Data/Configuration.swift +68 -0
- package/ios/Packages/VAD/Data/FrameSize.swift +39 -0
- package/ios/Packages/VAD/Data/Record.swift +13 -0
- package/ios/Packages/VAD/Data/Result.swift +22 -0
- package/ios/Packages/VAD/Data/SampleRate.swift +48 -0
- package/ios/Packages/VAD/Silero/Model/silero_vad.onnx +0 -0
- package/ios/Packages/VAD/Silero/SileroVAD.swift +284 -0
- package/ios/Packages/VAD/Silero/SileroVADStrategy.swift +64 -0
- package/ios/Packages/libbz2/module.modulemap +5 -0
- package/ios/Packages/libbz2/shim.h +1 -0
- package/ios/Source/Bridge.swift +353 -0
- package/ios/Source/Bridging-Header.h +16 -0
- package/ios/Source/DeviceManager.swift +1478 -0
- package/ios/Source/DeviceStore.swift +295 -0
- package/ios/Source/MentraBluetoothSDK.swift +2439 -0
- package/ios/Source/ObservableStore.swift +88 -0
- package/ios/Source/PrivacyInfo.xcprivacy +23 -0
- package/ios/Source/controllers/ControllerManager.swift +187 -0
- package/ios/Source/controllers/R1.swift +827 -0
- package/ios/Source/services/PhoneMic.swift +662 -0
- package/ios/Source/sgcs/Frame.swift +651 -0
- package/ios/Source/sgcs/G1.swift +2505 -0
- package/ios/Source/sgcs/G2.swift +3730 -0
- package/ios/Source/sgcs/Mach1.swift +543 -0
- package/ios/Source/sgcs/MentraLive.swift +4708 -0
- package/ios/Source/sgcs/MentraNex.swift +2479 -0
- package/ios/Source/sgcs/SGCManager.swift +243 -0
- package/ios/Source/sgcs/Simulated.swift +270 -0
- package/ios/Source/sgcs/mentraos_ble.pb.swift +3811 -0
- package/ios/Source/stt/STTTools.swift +154 -0
- package/ios/Source/stt/SherpaOnnxTranscriber.swift +401 -0
- package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
- package/ios/Source/utils/Constants.swift +74 -0
- package/ios/Source/utils/Enums.swift +95 -0
- package/ios/Source/utils/G1Text.swift +2067 -0
- package/ios/Source/utils/JSCExperiment.swift +241 -0
- package/ios/Source/utils/MemoryMonitor.swift +44 -0
- package/ios/Source/utils/MessageChunker.swift +164 -0
- package/ios/Source/utils/Models.swift +135 -0
- package/ios/Source/utils/PhoneAudioMonitor.swift +226 -0
- package/ios/Source/utils/TarBz2Extractor.swift +206 -0
- package/package.json +78 -0
- package/plugin/build/index.d.ts +6 -0
- package/plugin/build/index.js +12 -0
- package/plugin/build/withAndroid.d.ts +4 -0
- package/plugin/build/withAndroid.js +80 -0
- package/plugin/build/withIos.d.ts +4 -0
- package/plugin/build/withIos.js +64 -0
- package/src/BluetoothSdk.types.ts +581 -0
- package/src/BluetoothSdkModule.ts +259 -0
- package/src/index.ts +4 -0
|
@@ -0,0 +1,704 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2022 Google LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at:
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
******************************************************************************/
|
|
18
|
+
|
|
19
|
+
#include "lc3.h"
|
|
20
|
+
|
|
21
|
+
#include "common.h"
|
|
22
|
+
#include "bits.h"
|
|
23
|
+
|
|
24
|
+
#include "attdet.h"
|
|
25
|
+
#include "bwdet.h"
|
|
26
|
+
#include "ltpf.h"
|
|
27
|
+
#include "mdct.h"
|
|
28
|
+
#include "energy.h"
|
|
29
|
+
#include "sns.h"
|
|
30
|
+
#include "tns.h"
|
|
31
|
+
#include "spec.h"
|
|
32
|
+
#include "plc.h"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Frame side data
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
struct side_data {
|
|
40
|
+
enum lc3_bandwidth bw;
|
|
41
|
+
bool pitch_present;
|
|
42
|
+
lc3_ltpf_data_t ltpf;
|
|
43
|
+
lc3_sns_data_t sns;
|
|
44
|
+
lc3_tns_data_t tns;
|
|
45
|
+
lc3_spec_side_t spec;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
/* ----------------------------------------------------------------------------
|
|
50
|
+
* General
|
|
51
|
+
* -------------------------------------------------------------------------- */
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Resolve frame duration in us
|
|
55
|
+
* us Frame duration in us
|
|
56
|
+
* return Frame duration identifier, or LC3_NUM_DT
|
|
57
|
+
*/
|
|
58
|
+
static enum lc3_dt resolve_dt(int us)
|
|
59
|
+
{
|
|
60
|
+
return us == 7500 ? LC3_DT_7M5 :
|
|
61
|
+
us == 10000 ? LC3_DT_10M : LC3_NUM_DT;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Resolve samplerate in Hz
|
|
66
|
+
* hz Samplerate in Hz
|
|
67
|
+
* return Sample rate identifier, or LC3_NUM_SRATE
|
|
68
|
+
*/
|
|
69
|
+
static enum lc3_srate resolve_sr(int hz)
|
|
70
|
+
{
|
|
71
|
+
return hz == 8000 ? LC3_SRATE_8K : hz == 16000 ? LC3_SRATE_16K :
|
|
72
|
+
hz == 24000 ? LC3_SRATE_24K : hz == 32000 ? LC3_SRATE_32K :
|
|
73
|
+
hz == 48000 ? LC3_SRATE_48K : LC3_NUM_SRATE;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Return the number of PCM samples in a frame
|
|
78
|
+
*/
|
|
79
|
+
int lc3_frame_samples(int dt_us, int sr_hz)
|
|
80
|
+
{
|
|
81
|
+
enum lc3_dt dt = resolve_dt(dt_us);
|
|
82
|
+
enum lc3_srate sr = resolve_sr(sr_hz);
|
|
83
|
+
|
|
84
|
+
if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
|
|
85
|
+
return -1;
|
|
86
|
+
|
|
87
|
+
return LC3_NS(dt, sr);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Return the size of frames, from bitrate
|
|
92
|
+
*/
|
|
93
|
+
int lc3_frame_bytes(int dt_us, int bitrate)
|
|
94
|
+
{
|
|
95
|
+
if (resolve_dt(dt_us) >= LC3_NUM_DT)
|
|
96
|
+
return -1;
|
|
97
|
+
|
|
98
|
+
if (bitrate < LC3_MIN_BITRATE)
|
|
99
|
+
return LC3_MIN_FRAME_BYTES;
|
|
100
|
+
|
|
101
|
+
if (bitrate > LC3_MAX_BITRATE)
|
|
102
|
+
return LC3_MAX_FRAME_BYTES;
|
|
103
|
+
|
|
104
|
+
int nbytes = ((unsigned)bitrate * dt_us) / (1000*1000*8);
|
|
105
|
+
|
|
106
|
+
return LC3_CLIP(nbytes, LC3_MIN_FRAME_BYTES, LC3_MAX_FRAME_BYTES);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Resolve the bitrate, from the size of frames
|
|
111
|
+
*/
|
|
112
|
+
int lc3_resolve_bitrate(int dt_us, int nbytes)
|
|
113
|
+
{
|
|
114
|
+
if (resolve_dt(dt_us) >= LC3_NUM_DT)
|
|
115
|
+
return -1;
|
|
116
|
+
|
|
117
|
+
if (nbytes < LC3_MIN_FRAME_BYTES)
|
|
118
|
+
return LC3_MIN_BITRATE;
|
|
119
|
+
|
|
120
|
+
if (nbytes > LC3_MAX_FRAME_BYTES)
|
|
121
|
+
return LC3_MAX_BITRATE;
|
|
122
|
+
|
|
123
|
+
int bitrate = ((unsigned)nbytes * (1000*1000*8) + dt_us/2) / dt_us;
|
|
124
|
+
|
|
125
|
+
return LC3_CLIP(bitrate, LC3_MIN_BITRATE, LC3_MAX_BITRATE);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Return algorithmic delay, as a number of samples
|
|
130
|
+
*/
|
|
131
|
+
int lc3_delay_samples(int dt_us, int sr_hz)
|
|
132
|
+
{
|
|
133
|
+
enum lc3_dt dt = resolve_dt(dt_us);
|
|
134
|
+
enum lc3_srate sr = resolve_sr(sr_hz);
|
|
135
|
+
|
|
136
|
+
if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
|
|
137
|
+
return -1;
|
|
138
|
+
|
|
139
|
+
return (dt == LC3_DT_7M5 ? 8 : 5) * (LC3_SRATE_KHZ(sr) / 2);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
/* ----------------------------------------------------------------------------
|
|
144
|
+
* Encoder
|
|
145
|
+
* -------------------------------------------------------------------------- */
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Input PCM Samples from signed 16 bits
|
|
149
|
+
* encoder Encoder state
|
|
150
|
+
* pcm, stride Input PCM samples, and count between two consecutives
|
|
151
|
+
*/
|
|
152
|
+
static void load_s16(
|
|
153
|
+
struct lc3_encoder *encoder, const void *_pcm, int stride)
|
|
154
|
+
{
|
|
155
|
+
const int16_t *pcm = _pcm;
|
|
156
|
+
|
|
157
|
+
enum lc3_dt dt = encoder->dt;
|
|
158
|
+
enum lc3_srate sr = encoder->sr_pcm;
|
|
159
|
+
|
|
160
|
+
int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
|
|
161
|
+
float *xs = encoder->x + encoder->xs_off;
|
|
162
|
+
int ns = LC3_NS(dt, sr);
|
|
163
|
+
|
|
164
|
+
for (int i = 0; i < ns; i++, pcm += stride)
|
|
165
|
+
xt[i] = *pcm, xs[i] = *pcm;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Input PCM Samples from signed 24 bits
|
|
170
|
+
* encoder Encoder state
|
|
171
|
+
* pcm, stride Input PCM samples, and count between two consecutives
|
|
172
|
+
*/
|
|
173
|
+
static void load_s24(
|
|
174
|
+
struct lc3_encoder *encoder, const void *_pcm, int stride)
|
|
175
|
+
{
|
|
176
|
+
const int32_t *pcm = _pcm;
|
|
177
|
+
|
|
178
|
+
enum lc3_dt dt = encoder->dt;
|
|
179
|
+
enum lc3_srate sr = encoder->sr_pcm;
|
|
180
|
+
|
|
181
|
+
int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
|
|
182
|
+
float *xs = encoder->x + encoder->xs_off;
|
|
183
|
+
int ns = LC3_NS(dt, sr);
|
|
184
|
+
|
|
185
|
+
for (int i = 0; i < ns; i++, pcm += stride) {
|
|
186
|
+
xt[i] = *pcm >> 8;
|
|
187
|
+
xs[i] = ldexpf(*pcm, -8);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Input PCM Samples from signed 24 bits packed
|
|
193
|
+
* encoder Encoder state
|
|
194
|
+
* pcm, stride Input PCM samples, and count between two consecutives
|
|
195
|
+
*/
|
|
196
|
+
static void load_s24_3le(
|
|
197
|
+
struct lc3_encoder *encoder, const void *_pcm, int stride)
|
|
198
|
+
{
|
|
199
|
+
const uint8_t *pcm = _pcm;
|
|
200
|
+
|
|
201
|
+
enum lc3_dt dt = encoder->dt;
|
|
202
|
+
enum lc3_srate sr = encoder->sr_pcm;
|
|
203
|
+
|
|
204
|
+
int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
|
|
205
|
+
float *xs = encoder->x + encoder->xs_off;
|
|
206
|
+
int ns = LC3_NS(dt, sr);
|
|
207
|
+
|
|
208
|
+
for (int i = 0; i < ns; i++, pcm += 3*stride) {
|
|
209
|
+
int32_t in = ((uint32_t)pcm[0] << 8) |
|
|
210
|
+
((uint32_t)pcm[1] << 16) |
|
|
211
|
+
((uint32_t)pcm[2] << 24) ;
|
|
212
|
+
|
|
213
|
+
xt[i] = in >> 16;
|
|
214
|
+
xs[i] = ldexpf(in, -16);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Input PCM Samples from float 32 bits
|
|
220
|
+
* encoder Encoder state
|
|
221
|
+
* pcm, stride Input PCM samples, and count between two consecutives
|
|
222
|
+
*/
|
|
223
|
+
static void load_float(
|
|
224
|
+
struct lc3_encoder *encoder, const void *_pcm, int stride)
|
|
225
|
+
{
|
|
226
|
+
const float *pcm = _pcm;
|
|
227
|
+
|
|
228
|
+
enum lc3_dt dt = encoder->dt;
|
|
229
|
+
enum lc3_srate sr = encoder->sr_pcm;
|
|
230
|
+
|
|
231
|
+
int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
|
|
232
|
+
float *xs = encoder->x + encoder->xs_off;
|
|
233
|
+
int ns = LC3_NS(dt, sr);
|
|
234
|
+
|
|
235
|
+
for (int i = 0; i < ns; i++, pcm += stride) {
|
|
236
|
+
xs[i] = ldexpf(*pcm, 15);
|
|
237
|
+
xt[i] = LC3_SAT16((int32_t)xs[i]);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Frame Analysis
|
|
243
|
+
* encoder Encoder state
|
|
244
|
+
* nbytes Size in bytes of the frame
|
|
245
|
+
* side, xq Return frame data
|
|
246
|
+
*/
|
|
247
|
+
static void analyze(struct lc3_encoder *encoder,
|
|
248
|
+
int nbytes, struct side_data *side, uint16_t *xq)
|
|
249
|
+
{
|
|
250
|
+
enum lc3_dt dt = encoder->dt;
|
|
251
|
+
enum lc3_srate sr = encoder->sr;
|
|
252
|
+
enum lc3_srate sr_pcm = encoder->sr_pcm;
|
|
253
|
+
int ns = LC3_NS(dt, sr_pcm);
|
|
254
|
+
int nt = LC3_NT(sr_pcm);
|
|
255
|
+
|
|
256
|
+
int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
|
|
257
|
+
float *xs = encoder->x + encoder->xs_off;
|
|
258
|
+
float *xd = encoder->x + encoder->xd_off;
|
|
259
|
+
float *xf = xs;
|
|
260
|
+
|
|
261
|
+
/* --- Temporal --- */
|
|
262
|
+
|
|
263
|
+
bool att = lc3_attdet_run(dt, sr_pcm, nbytes, &encoder->attdet, xt);
|
|
264
|
+
|
|
265
|
+
side->pitch_present =
|
|
266
|
+
lc3_ltpf_analyse(dt, sr_pcm, &encoder->ltpf, xt, &side->ltpf);
|
|
267
|
+
|
|
268
|
+
memmove(xt - nt, xt + (ns-nt), nt * sizeof(*xt));
|
|
269
|
+
|
|
270
|
+
/* --- Spectral --- */
|
|
271
|
+
|
|
272
|
+
float e[LC3_NUM_BANDS];
|
|
273
|
+
|
|
274
|
+
lc3_mdct_forward(dt, sr_pcm, sr, xs, xd, xf);
|
|
275
|
+
|
|
276
|
+
bool nn_flag = lc3_energy_compute(dt, sr, xf, e);
|
|
277
|
+
if (nn_flag)
|
|
278
|
+
lc3_ltpf_disable(&side->ltpf);
|
|
279
|
+
|
|
280
|
+
side->bw = lc3_bwdet_run(dt, sr, e);
|
|
281
|
+
|
|
282
|
+
lc3_sns_analyze(dt, sr, e, att, &side->sns, xf, xf);
|
|
283
|
+
|
|
284
|
+
lc3_tns_analyze(dt, side->bw, nn_flag, nbytes, &side->tns, xf);
|
|
285
|
+
|
|
286
|
+
lc3_spec_analyze(dt, sr,
|
|
287
|
+
nbytes, side->pitch_present, &side->tns,
|
|
288
|
+
&encoder->spec, xf, xq, &side->spec);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Encode bitstream
|
|
293
|
+
* encoder Encoder state
|
|
294
|
+
* side, xq The frame data
|
|
295
|
+
* nbytes Target size of the frame (20 to 400)
|
|
296
|
+
* buffer Output bitstream buffer of `nbytes` size
|
|
297
|
+
*/
|
|
298
|
+
static void encode(struct lc3_encoder *encoder,
|
|
299
|
+
const struct side_data *side, uint16_t *xq, int nbytes, void *buffer)
|
|
300
|
+
{
|
|
301
|
+
enum lc3_dt dt = encoder->dt;
|
|
302
|
+
enum lc3_srate sr = encoder->sr;
|
|
303
|
+
enum lc3_bandwidth bw = side->bw;
|
|
304
|
+
float *xf = encoder->x + encoder->xs_off;
|
|
305
|
+
|
|
306
|
+
lc3_bits_t bits;
|
|
307
|
+
|
|
308
|
+
lc3_setup_bits(&bits, LC3_BITS_MODE_WRITE, buffer, nbytes);
|
|
309
|
+
|
|
310
|
+
lc3_bwdet_put_bw(&bits, sr, bw);
|
|
311
|
+
|
|
312
|
+
lc3_spec_put_side(&bits, dt, sr, &side->spec);
|
|
313
|
+
|
|
314
|
+
lc3_tns_put_data(&bits, &side->tns);
|
|
315
|
+
|
|
316
|
+
lc3_put_bit(&bits, side->pitch_present);
|
|
317
|
+
|
|
318
|
+
lc3_sns_put_data(&bits, &side->sns);
|
|
319
|
+
|
|
320
|
+
if (side->pitch_present)
|
|
321
|
+
lc3_ltpf_put_data(&bits, &side->ltpf);
|
|
322
|
+
|
|
323
|
+
lc3_spec_encode(&bits,
|
|
324
|
+
dt, sr, bw, nbytes, xq, &side->spec, xf);
|
|
325
|
+
|
|
326
|
+
lc3_flush_bits(&bits);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Return size needed for an encoder
|
|
331
|
+
*/
|
|
332
|
+
unsigned lc3_encoder_size(int dt_us, int sr_hz)
|
|
333
|
+
{
|
|
334
|
+
if (resolve_dt(dt_us) >= LC3_NUM_DT ||
|
|
335
|
+
resolve_sr(sr_hz) >= LC3_NUM_SRATE)
|
|
336
|
+
return 0;
|
|
337
|
+
|
|
338
|
+
return sizeof(struct lc3_encoder) +
|
|
339
|
+
(LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)-1) * sizeof(float);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Setup encoder
|
|
344
|
+
*/
|
|
345
|
+
struct lc3_encoder *lc3_setup_encoder(
|
|
346
|
+
int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
|
|
347
|
+
{
|
|
348
|
+
if (sr_pcm_hz <= 0)
|
|
349
|
+
sr_pcm_hz = sr_hz;
|
|
350
|
+
|
|
351
|
+
enum lc3_dt dt = resolve_dt(dt_us);
|
|
352
|
+
enum lc3_srate sr = resolve_sr(sr_hz);
|
|
353
|
+
enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
|
|
354
|
+
|
|
355
|
+
if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
|
|
356
|
+
return NULL;
|
|
357
|
+
|
|
358
|
+
struct lc3_encoder *encoder = mem;
|
|
359
|
+
int ns = LC3_NS(dt, sr_pcm);
|
|
360
|
+
int nt = LC3_NT(sr_pcm);
|
|
361
|
+
|
|
362
|
+
*encoder = (struct lc3_encoder){
|
|
363
|
+
.dt = dt, .sr = sr,
|
|
364
|
+
.sr_pcm = sr_pcm,
|
|
365
|
+
|
|
366
|
+
.xt_off = nt,
|
|
367
|
+
.xs_off = (nt + ns) / 2,
|
|
368
|
+
.xd_off = (nt + ns) / 2 + ns,
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
memset(encoder->x, 0,
|
|
372
|
+
LC3_ENCODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
|
|
373
|
+
|
|
374
|
+
return encoder;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Encode a frame
|
|
379
|
+
*/
|
|
380
|
+
int lc3_encode(struct lc3_encoder *encoder, enum lc3_pcm_format fmt,
|
|
381
|
+
const void *pcm, int stride, int nbytes, void *out)
|
|
382
|
+
{
|
|
383
|
+
static void (* const load[])(struct lc3_encoder *, const void *, int) = {
|
|
384
|
+
[LC3_PCM_FORMAT_S16 ] = load_s16,
|
|
385
|
+
[LC3_PCM_FORMAT_S24 ] = load_s24,
|
|
386
|
+
[LC3_PCM_FORMAT_S24_3LE] = load_s24_3le,
|
|
387
|
+
[LC3_PCM_FORMAT_FLOAT ] = load_float,
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
/* --- Check parameters --- */
|
|
391
|
+
|
|
392
|
+
if (!encoder || nbytes < LC3_MIN_FRAME_BYTES
|
|
393
|
+
|| nbytes > LC3_MAX_FRAME_BYTES)
|
|
394
|
+
return -1;
|
|
395
|
+
|
|
396
|
+
/* --- Processing --- */
|
|
397
|
+
|
|
398
|
+
struct side_data side;
|
|
399
|
+
uint16_t xq[LC3_MAX_NE];
|
|
400
|
+
|
|
401
|
+
load[fmt](encoder, pcm, stride);
|
|
402
|
+
|
|
403
|
+
analyze(encoder, nbytes, &side, xq);
|
|
404
|
+
|
|
405
|
+
encode(encoder, &side, xq, nbytes, out);
|
|
406
|
+
|
|
407
|
+
return 0;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
/* ----------------------------------------------------------------------------
|
|
412
|
+
* Decoder
|
|
413
|
+
* -------------------------------------------------------------------------- */
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Output PCM Samples to signed 16 bits
|
|
417
|
+
* decoder Decoder state
|
|
418
|
+
* pcm, stride Output PCM samples, and count between two consecutives
|
|
419
|
+
*/
|
|
420
|
+
static void store_s16(
|
|
421
|
+
struct lc3_decoder *decoder, void *_pcm, int stride)
|
|
422
|
+
{
|
|
423
|
+
int16_t *pcm = _pcm;
|
|
424
|
+
|
|
425
|
+
enum lc3_dt dt = decoder->dt;
|
|
426
|
+
enum lc3_srate sr = decoder->sr_pcm;
|
|
427
|
+
|
|
428
|
+
float *xs = decoder->x + decoder->xs_off;
|
|
429
|
+
int ns = LC3_NS(dt, sr);
|
|
430
|
+
|
|
431
|
+
for ( ; ns > 0; ns--, xs++, pcm += stride) {
|
|
432
|
+
int32_t s = *xs >= 0 ? (int)(*xs + 0.5f) : (int)(*xs - 0.5f);
|
|
433
|
+
*pcm = LC3_SAT16(s);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Output PCM Samples to signed 24 bits
|
|
439
|
+
* decoder Decoder state
|
|
440
|
+
* pcm, stride Output PCM samples, and count between two consecutives
|
|
441
|
+
*/
|
|
442
|
+
static void store_s24(
|
|
443
|
+
struct lc3_decoder *decoder, void *_pcm, int stride)
|
|
444
|
+
{
|
|
445
|
+
int32_t *pcm = _pcm;
|
|
446
|
+
|
|
447
|
+
enum lc3_dt dt = decoder->dt;
|
|
448
|
+
enum lc3_srate sr = decoder->sr_pcm;
|
|
449
|
+
|
|
450
|
+
float *xs = decoder->x + decoder->xs_off;
|
|
451
|
+
int ns = LC3_NS(dt, sr);
|
|
452
|
+
|
|
453
|
+
for ( ; ns > 0; ns--, xs++, pcm += stride) {
|
|
454
|
+
int32_t s = *xs >= 0 ? (int32_t)(ldexpf(*xs, 8) + 0.5f)
|
|
455
|
+
: (int32_t)(ldexpf(*xs, 8) - 0.5f);
|
|
456
|
+
*pcm = LC3_SAT24(s);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Output PCM Samples to signed 24 bits packed
|
|
462
|
+
* decoder Decoder state
|
|
463
|
+
* pcm, stride Output PCM samples, and count between two consecutives
|
|
464
|
+
*/
|
|
465
|
+
static void store_s24_3le(
|
|
466
|
+
struct lc3_decoder *decoder, void *_pcm, int stride)
|
|
467
|
+
{
|
|
468
|
+
uint8_t *pcm = _pcm;
|
|
469
|
+
|
|
470
|
+
enum lc3_dt dt = decoder->dt;
|
|
471
|
+
enum lc3_srate sr = decoder->sr_pcm;
|
|
472
|
+
|
|
473
|
+
float *xs = decoder->x + decoder->xs_off;
|
|
474
|
+
int ns = LC3_NS(dt, sr);
|
|
475
|
+
|
|
476
|
+
for ( ; ns > 0; ns--, xs++, pcm += 3*stride) {
|
|
477
|
+
int32_t s = *xs >= 0 ? (int32_t)(ldexpf(*xs, 8) + 0.5f)
|
|
478
|
+
: (int32_t)(ldexpf(*xs, 8) - 0.5f);
|
|
479
|
+
|
|
480
|
+
s = LC3_SAT24(s);
|
|
481
|
+
pcm[0] = (s >> 0) & 0xff;
|
|
482
|
+
pcm[1] = (s >> 8) & 0xff;
|
|
483
|
+
pcm[2] = (s >> 16) & 0xff;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Output PCM Samples to float 32 bits
|
|
489
|
+
* decoder Decoder state
|
|
490
|
+
* pcm, stride Output PCM samples, and count between two consecutives
|
|
491
|
+
*/
|
|
492
|
+
static void store_float(
|
|
493
|
+
struct lc3_decoder *decoder, void *_pcm, int stride)
|
|
494
|
+
{
|
|
495
|
+
float *pcm = _pcm;
|
|
496
|
+
|
|
497
|
+
enum lc3_dt dt = decoder->dt;
|
|
498
|
+
enum lc3_srate sr = decoder->sr_pcm;
|
|
499
|
+
|
|
500
|
+
float *xs = decoder->x + decoder->xs_off;
|
|
501
|
+
int ns = LC3_NS(dt, sr);
|
|
502
|
+
|
|
503
|
+
for ( ; ns > 0; ns--, xs++, pcm += stride) {
|
|
504
|
+
float s = ldexpf(*xs, -15);
|
|
505
|
+
*pcm = fminf(fmaxf(s, -1.f), 1.f);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Decode bitstream
|
|
511
|
+
* decoder Decoder state
|
|
512
|
+
* data, nbytes Input bitstream buffer
|
|
513
|
+
* side Return the side data
|
|
514
|
+
* return 0: Ok < 0: Bitsream error detected
|
|
515
|
+
*/
|
|
516
|
+
static int decode(struct lc3_decoder *decoder,
|
|
517
|
+
const void *data, int nbytes, struct side_data *side)
|
|
518
|
+
{
|
|
519
|
+
enum lc3_dt dt = decoder->dt;
|
|
520
|
+
enum lc3_srate sr = decoder->sr;
|
|
521
|
+
|
|
522
|
+
float *xf = decoder->x + decoder->xs_off;
|
|
523
|
+
int ns = LC3_NS(dt, sr);
|
|
524
|
+
int ne = LC3_NE(dt, sr);
|
|
525
|
+
|
|
526
|
+
lc3_bits_t bits;
|
|
527
|
+
int ret = 0;
|
|
528
|
+
|
|
529
|
+
lc3_setup_bits(&bits, LC3_BITS_MODE_READ, (void *)data, nbytes);
|
|
530
|
+
|
|
531
|
+
if ((ret = lc3_bwdet_get_bw(&bits, sr, &side->bw)) < 0)
|
|
532
|
+
return ret;
|
|
533
|
+
|
|
534
|
+
if ((ret = lc3_spec_get_side(&bits, dt, sr, &side->spec)) < 0)
|
|
535
|
+
return ret;
|
|
536
|
+
|
|
537
|
+
lc3_tns_get_data(&bits, dt, side->bw, nbytes, &side->tns);
|
|
538
|
+
|
|
539
|
+
side->pitch_present = lc3_get_bit(&bits);
|
|
540
|
+
|
|
541
|
+
if ((ret = lc3_sns_get_data(&bits, &side->sns)) < 0)
|
|
542
|
+
return ret;
|
|
543
|
+
|
|
544
|
+
if (side->pitch_present)
|
|
545
|
+
lc3_ltpf_get_data(&bits, &side->ltpf);
|
|
546
|
+
|
|
547
|
+
if ((ret = lc3_spec_decode(&bits, dt, sr,
|
|
548
|
+
side->bw, nbytes, &side->spec, xf)) < 0)
|
|
549
|
+
return ret;
|
|
550
|
+
|
|
551
|
+
memset(xf + ne, 0, (ns - ne) * sizeof(float));
|
|
552
|
+
|
|
553
|
+
return lc3_check_bits(&bits);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Frame synthesis
|
|
558
|
+
* decoder Decoder state
|
|
559
|
+
* side Frame data, NULL performs PLC
|
|
560
|
+
* nbytes Size in bytes of the frame
|
|
561
|
+
*/
|
|
562
|
+
static void synthesize(struct lc3_decoder *decoder,
|
|
563
|
+
const struct side_data *side, int nbytes)
|
|
564
|
+
{
|
|
565
|
+
enum lc3_dt dt = decoder->dt;
|
|
566
|
+
enum lc3_srate sr = decoder->sr;
|
|
567
|
+
enum lc3_srate sr_pcm = decoder->sr_pcm;
|
|
568
|
+
|
|
569
|
+
float *xf = decoder->x + decoder->xs_off;
|
|
570
|
+
int ns = LC3_NS(dt, sr_pcm);
|
|
571
|
+
int ne = LC3_NE(dt, sr);
|
|
572
|
+
|
|
573
|
+
float *xg = decoder->x + decoder->xg_off;
|
|
574
|
+
float *xs = xf;
|
|
575
|
+
|
|
576
|
+
float *xd = decoder->x + decoder->xd_off;
|
|
577
|
+
float *xh = decoder->x + decoder->xh_off;
|
|
578
|
+
|
|
579
|
+
if (side) {
|
|
580
|
+
enum lc3_bandwidth bw = side->bw;
|
|
581
|
+
|
|
582
|
+
lc3_plc_suspend(&decoder->plc);
|
|
583
|
+
|
|
584
|
+
lc3_tns_synthesize(dt, bw, &side->tns, xf);
|
|
585
|
+
|
|
586
|
+
lc3_sns_synthesize(dt, sr, &side->sns, xf, xg);
|
|
587
|
+
|
|
588
|
+
lc3_mdct_inverse(dt, sr_pcm, sr, xg, xd, xs);
|
|
589
|
+
|
|
590
|
+
} else {
|
|
591
|
+
lc3_plc_synthesize(dt, sr, &decoder->plc, xg, xf);
|
|
592
|
+
|
|
593
|
+
memset(xf + ne, 0, (ns - ne) * sizeof(float));
|
|
594
|
+
|
|
595
|
+
lc3_mdct_inverse(dt, sr_pcm, sr, xf, xd, xs);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
lc3_ltpf_synthesize(dt, sr_pcm, nbytes, &decoder->ltpf,
|
|
599
|
+
side && side->pitch_present ? &side->ltpf : NULL, xh, xs);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* Update decoder state on decoding completion
|
|
604
|
+
* decoder Decoder state
|
|
605
|
+
*/
|
|
606
|
+
static void complete(struct lc3_decoder *decoder)
|
|
607
|
+
{
|
|
608
|
+
enum lc3_dt dt = decoder->dt;
|
|
609
|
+
enum lc3_srate sr_pcm = decoder->sr_pcm;
|
|
610
|
+
int nh = LC3_NH(dt, sr_pcm);
|
|
611
|
+
int ns = LC3_NS(dt, sr_pcm);
|
|
612
|
+
|
|
613
|
+
decoder->xs_off = decoder->xs_off - decoder->xh_off < nh - ns ?
|
|
614
|
+
decoder->xs_off + ns : decoder->xh_off;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/**
|
|
618
|
+
* Return size needed for a decoder
|
|
619
|
+
*/
|
|
620
|
+
unsigned lc3_decoder_size(int dt_us, int sr_hz)
|
|
621
|
+
{
|
|
622
|
+
if (resolve_dt(dt_us) >= LC3_NUM_DT ||
|
|
623
|
+
resolve_sr(sr_hz) >= LC3_NUM_SRATE)
|
|
624
|
+
return 0;
|
|
625
|
+
|
|
626
|
+
return sizeof(struct lc3_decoder) +
|
|
627
|
+
(LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)-1) * sizeof(float);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* Setup decoder
|
|
632
|
+
*/
|
|
633
|
+
struct lc3_decoder *lc3_setup_decoder(
|
|
634
|
+
int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
|
|
635
|
+
{
|
|
636
|
+
if (sr_pcm_hz <= 0)
|
|
637
|
+
sr_pcm_hz = sr_hz;
|
|
638
|
+
|
|
639
|
+
enum lc3_dt dt = resolve_dt(dt_us);
|
|
640
|
+
enum lc3_srate sr = resolve_sr(sr_hz);
|
|
641
|
+
enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
|
|
642
|
+
|
|
643
|
+
if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
|
|
644
|
+
return NULL;
|
|
645
|
+
|
|
646
|
+
struct lc3_decoder *decoder = mem;
|
|
647
|
+
int nh = LC3_NH(dt, sr_pcm);
|
|
648
|
+
int ns = LC3_NS(dt, sr_pcm);
|
|
649
|
+
int nd = LC3_ND(dt, sr_pcm);
|
|
650
|
+
|
|
651
|
+
*decoder = (struct lc3_decoder){
|
|
652
|
+
.dt = dt, .sr = sr,
|
|
653
|
+
.sr_pcm = sr_pcm,
|
|
654
|
+
|
|
655
|
+
.xh_off = 0,
|
|
656
|
+
.xs_off = nh - ns,
|
|
657
|
+
.xd_off = nh,
|
|
658
|
+
.xg_off = nh + nd,
|
|
659
|
+
};
|
|
660
|
+
|
|
661
|
+
lc3_plc_reset(&decoder->plc);
|
|
662
|
+
|
|
663
|
+
memset(decoder->x, 0,
|
|
664
|
+
LC3_DECODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
|
|
665
|
+
|
|
666
|
+
return decoder;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* Decode a frame
|
|
671
|
+
*/
|
|
672
|
+
int lc3_decode(struct lc3_decoder *decoder, const void *in, int nbytes,
|
|
673
|
+
enum lc3_pcm_format fmt, void *pcm, int stride)
|
|
674
|
+
{
|
|
675
|
+
static void (* const store[])(struct lc3_decoder *, void *, int) = {
|
|
676
|
+
[LC3_PCM_FORMAT_S16 ] = store_s16,
|
|
677
|
+
[LC3_PCM_FORMAT_S24 ] = store_s24,
|
|
678
|
+
[LC3_PCM_FORMAT_S24_3LE] = store_s24_3le,
|
|
679
|
+
[LC3_PCM_FORMAT_FLOAT ] = store_float,
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
/* --- Check parameters --- */
|
|
683
|
+
|
|
684
|
+
if (!decoder)
|
|
685
|
+
return -1;
|
|
686
|
+
|
|
687
|
+
if (in && (nbytes < LC3_MIN_FRAME_BYTES ||
|
|
688
|
+
nbytes > LC3_MAX_FRAME_BYTES ))
|
|
689
|
+
return -1;
|
|
690
|
+
|
|
691
|
+
/* --- Processing --- */
|
|
692
|
+
|
|
693
|
+
struct side_data side;
|
|
694
|
+
|
|
695
|
+
int ret = !in || (decode(decoder, in, nbytes, &side) < 0);
|
|
696
|
+
|
|
697
|
+
synthesize(decoder, ret ? NULL : &side, nbytes);
|
|
698
|
+
|
|
699
|
+
store[fmt](decoder, pcm, stride);
|
|
700
|
+
|
|
701
|
+
complete(decoder);
|
|
702
|
+
|
|
703
|
+
return ret;
|
|
704
|
+
}
|