Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/humla.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/se/lublin/humla/audio/javacpp/Opus.java')
-rw-r--r--src/main/java/se/lublin/humla/audio/javacpp/Opus.java100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/main/java/se/lublin/humla/audio/javacpp/Opus.java b/src/main/java/se/lublin/humla/audio/javacpp/Opus.java
new file mode 100644
index 0000000..879c3e2
--- /dev/null
+++ b/src/main/java/se/lublin/humla/audio/javacpp/Opus.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2014 Andrew Comminos
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package se.lublin.humla.audio.javacpp;
+
+import com.googlecode.javacpp.IntPointer;
+import com.googlecode.javacpp.Loader;
+import com.googlecode.javacpp.Pointer;
+import com.googlecode.javacpp.annotation.Cast;
+import com.googlecode.javacpp.annotation.Platform;
+import se.lublin.humla.audio.IDecoder;
+import se.lublin.humla.exception.NativeAudioException;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Created by andrew on 18/10/13.
+ */
+
+@Platform(library= "jniopus", cinclude={"<opus.h>","<opus_types.h>"})
+public class Opus {
+ public static final int OPUS_APPLICATION_VOIP = 2048;
+
+ public static final int OPUS_SET_BITRATE_REQUEST = 4002;
+ public static final int OPUS_GET_BITRATE_REQUEST = 4003;
+ public static final int OPUS_SET_VBR_REQUEST = 4006;
+
+ public static native int opus_decoder_get_size(int channels);
+ public static native Pointer opus_decoder_create(int fs, int channels, IntPointer error);
+ public static native int opus_decoder_init(@Cast("OpusDecoder*") Pointer st, int fs, int channels);
+ public static native int opus_decode(@Cast("OpusDecoder*") Pointer st, @Cast("const unsigned char*") ByteBuffer data, int len, short[] out, int frameSize, int decodeFec);
+ public static native int opus_decode_float(@Cast("OpusDecoder*") Pointer st, @Cast("const unsigned char*") ByteBuffer data, int len, float[] out, int frameSize, int decodeFec);
+ //public static native int opus_decoder_ctl(@Cast("OpusDecoder*") Pointer st, int request);
+ public static native void opus_decoder_destroy(@Cast("OpusDecoder*") Pointer st);
+ //public static native int opus_packet_parse(@Cast("const unsigned char*") BytePointer data, int len, ...
+ public static native int opus_packet_get_bandwidth(@Cast("const unsigned char*") byte[] data);
+ public static native int opus_packet_get_samples_per_frame(@Cast("const unsigned char*") byte[] data, int fs);
+ public static native int opus_packet_get_nb_channels(@Cast("const unsigned char*") byte[] data);
+ public static native int opus_packet_get_nb_frames(@Cast("const unsigned char*") byte[] packet, int len);
+ public static native int opus_packet_get_nb_samples(@Cast("const unsigned char*") byte[] packet, int len, int fs);
+
+
+ public static native int opus_encoder_get_size(int channels);
+ public static native Pointer opus_encoder_create(int fs, int channels, int application, IntPointer error);
+ public static native int opus_encoder_init(@Cast("OpusEncoder*") Pointer st, int fs, int channels, int application);
+ public static native int opus_encode(@Cast("OpusEncoder*") Pointer st, @Cast("const short*") short[] pcm, int frameSize, @Cast("unsigned char*") byte[] data, int maxDataBytes);
+ public static native int opus_encode_float(@Cast("OpusEncoder*") Pointer st, @Cast("const float*") float[] pcm, int frameSize, @Cast("unsigned char*") byte[] data, int maxDataBytes);
+ public static native void opus_encoder_destroy(@Cast("OpusEncoder*") Pointer st);
+ public static native int opus_encoder_ctl(@Cast("OpusEncoder*") Pointer st, int request, Pointer value);
+ public static native int opus_encoder_ctl(@Cast("OpusEncoder*") Pointer st, int request, @Cast("opus_int32") int value);
+
+ static {
+ Loader.load();
+ }
+
+ public static class OpusDecoder implements IDecoder {
+
+ private Pointer mState;
+
+ public OpusDecoder(int sampleRate, int channels) throws NativeAudioException {
+ IntPointer error = new IntPointer(1);
+ error.put(0);
+ mState = opus_decoder_create(sampleRate, channels, error);
+ if(error.get() < 0) throw new NativeAudioException("Opus decoder initialization failed with error: "+error.get());
+ }
+
+ @Override
+ public int decodeFloat(ByteBuffer input, int inputSize, float[] output, int frameSize) throws NativeAudioException {
+ int result = opus_decode_float(mState, input, inputSize, output, frameSize, 0);
+ if(result < 0) throw new NativeAudioException("Opus decoding failed with error: "+result);
+ return result;
+ }
+
+ @Override
+ public int decodeShort(ByteBuffer input, int inputSize, short[] output, int frameSize) throws NativeAudioException {
+ int result = opus_decode(mState, input, inputSize, output, frameSize, 0);
+ if(result < 0) throw new NativeAudioException("Opus decoding failed with error: "+result);
+ return result;
+ }
+
+ @Override
+ public void destroy() {
+ opus_decoder_destroy(mState);
+ }
+ }
+}