aboutsummaryrefslogtreecommitdiffstats
path: root/src/native
diff options
context:
space:
mode:
authorLyubomir Marinov <lyubomir.marinov@jitsi.org>2010-06-14 17:47:31 +0000
committerLyubomir Marinov <lyubomir.marinov@jitsi.org>2010-06-14 17:47:31 +0000
commit60bbb1d4bf4858416d930ecbc24fb4b79a6197b8 (patch)
tree5c7bb8d4739b84dff4a96a55486a640bf71eacdf /src/native
parent971cc0ecee7f02f0c4b20db7a101e80d8e9ddbf4 (diff)
downloadjitsi-60bbb1d4bf4858416d930ecbc24fb4b79a6197b8.zip
jitsi-60bbb1d4bf4858416d930ecbc24fb4b79a6197b8.tar.gz
jitsi-60bbb1d4bf4858416d930ecbc24fb4b79a6197b8.tar.bz2
Implements Speex encoder, decoder and resampler using the native Speex library. Since the JNI binaries are not available, the new functionality shouldn't cause regressions.
Diffstat (limited to 'src/native')
-rw-r--r--src/native/speex/Makefile15
-rw-r--r--src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.c284
-rw-r--r--src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.h189
3 files changed, 488 insertions, 0 deletions
diff --git a/src/native/speex/Makefile b/src/native/speex/Makefile
new file mode 100644
index 0000000..1376ddc
--- /dev/null
+++ b/src/native/speex/Makefile
@@ -0,0 +1,15 @@
+JAVA_HOME?=/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home
+SPEEX_HOME?=/Users/Lubomir/src/speex-1.2rc1
+
+TARGET=../../../lib/native/mac/libjspeex.jnilib
+
+CC=gcc -arch i386 -arch ppc -arch x86_64 -mmacosx-version-min=10.4
+CPPFLAGS=-DJNI_IMPLEMENTATION \
+ -Wall -Wreturn-type \
+ -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux \
+ -I$(SPEEX_HOME)/include
+LDFLAGS=-dynamiclib
+LIBS=-L$(SPEEX_HOME)/libspeex/.libs -dynamic -lspeex -lspeexdsp -lm
+
+$(TARGET): net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.c net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.h
+ $(CC) $(CPPFLAGS) $< $(LDFLAGS) -o $@ $(LIBS)
diff --git a/src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.c b/src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.c
new file mode 100644
index 0000000..0218766
--- /dev/null
+++ b/src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.c
@@ -0,0 +1,284 @@
+#include "net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.h"
+
+#include <speex/speex.h>
+#include <speex/speex_resampler.h>
+#include <stdlib.h>
+
+JNIEXPORT void JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1destroy
+ (JNIEnv *jniEnv, jclass clazz, jlong bits)
+{
+ SpeexBits *bitsPtr = (SpeexBits *) bits;
+
+ speex_bits_destroy(bitsPtr);
+ free(bitsPtr);
+}
+
+JNIEXPORT jlong JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1init
+ (JNIEnv *jniEnv, jclass clazz)
+{
+ SpeexBits *bits = malloc(sizeof(SpeexBits));
+
+ if (bits)
+ speex_bits_init(bits);
+ return (jlong) bits;
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1nbytes
+ (JNIEnv *jniEnv, jclass clazz, jlong bits)
+{
+ return speex_bits_nbytes((SpeexBits *) bits);
+}
+
+JNIEXPORT void JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1read_1from
+ (JNIEnv *jniEnv, jclass clazz,
+ jlong bits, jbyteArray bytes, jint bytesOffset, jint len)
+{
+ jbyte *bytesPtr = (*jniEnv)->GetPrimitiveArrayCritical(jniEnv, bytes, NULL);
+
+ if (bytesPtr)
+ {
+ speex_bits_read_from(
+ (SpeexBits *) bits,
+ (char *) (bytesPtr + bytesOffset),
+ len);
+ (*jniEnv)->ReleasePrimitiveArrayCritical(
+ jniEnv,
+ bytes,
+ bytesPtr,
+ JNI_ABORT);
+ }
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1remaining
+ (JNIEnv *jniEnv, jclass clazz, jlong bits)
+{
+ return speex_bits_remaining((SpeexBits *) bits);
+}
+
+JNIEXPORT void JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1reset
+ (JNIEnv *jniEnv, jclass clazz, jlong bits)
+{
+ speex_bits_reset((SpeexBits *) bits);
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1write
+ (JNIEnv *jniEnv, jclass clazz,
+ jlong bits, jbyteArray bytes, jint bytesOffset, jint max_len)
+{
+ jbyte *bytesPtr = (*jniEnv)->GetPrimitiveArrayCritical(jniEnv, bytes, NULL);
+ jint ret;
+
+ if (bytesPtr)
+ {
+ ret
+ = speex_bits_write(
+ (SpeexBits *) bits,
+ (char *) (bytesPtr + bytesOffset),
+ max_len);
+ (*jniEnv)->ReleasePrimitiveArrayCritical(jniEnv, bytes, bytesPtr, 0);
+ }
+ else
+ ret = 0;
+ return ret;
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decode_1int
+ (JNIEnv *jniEnv, jclass clazz,
+ jlong state, jlong bits, jbyteArray out, jint outOffset)
+{
+ jbyte *outPtr = (*jniEnv)->GetByteArrayElements(jniEnv, out, NULL);
+ jint ret;
+
+ if (outPtr)
+ {
+ ret
+ = speex_decode_int(
+ (void *) state,
+ (SpeexBits *) bits,
+ (spx_int16_t *) (outPtr + outOffset));
+ (*jniEnv)->ReleaseByteArrayElements(jniEnv, out, outPtr, 0);
+ }
+ else
+ ret = -2;
+ return ret;
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1ctl__JI
+ (JNIEnv *jniEnv, jclass clazz, jlong state, jint request)
+{
+ int ret;
+ int value = 0;
+
+ ret = speex_decoder_ctl((void *) state, request, &value);
+ if (ret == 0)
+ ret = value;
+ return ret;
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1ctl__JII
+ (JNIEnv *jniEnv, jclass clazz, jlong state, jint request, jint value)
+{
+ return speex_decoder_ctl((void *) state, request, &value);
+}
+
+JNIEXPORT void JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1destroy
+ (JNIEnv *jniEnv, jclass clazz, jlong state)
+{
+ speex_decoder_destroy((void *) state);
+}
+
+JNIEXPORT jlong JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1init
+ (JNIEnv *jniEnv, jclass clazz, jlong mode)
+{
+ return (jlong) speex_decoder_init((SpeexMode *) mode);
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encode_1int
+ (JNIEnv *jniEnv, jclass clazz,
+ jlong state, jbyteArray in, jint inOffset, jlong bits)
+{
+ jbyte *inPtr = (*jniEnv)->GetByteArrayElements(jniEnv, in, NULL);
+ jint ret;
+
+ if (inPtr)
+ {
+ ret
+ = speex_encode_int(
+ (void *) state,
+ (spx_int16_t *) (inPtr + inOffset),
+ (SpeexBits *) bits);
+ (*jniEnv)->ReleaseByteArrayElements(jniEnv, in, inPtr, JNI_ABORT);
+ }
+ else
+ ret = 0;
+ return ret;
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1ctl__JI
+ (JNIEnv *jniEnv, jclass clazz, jlong state, jint request)
+{
+ int ret;
+ int value = 0;
+
+ ret = speex_encoder_ctl((void *) state, request, &value);
+ if (ret == 0)
+ ret = value;
+ return ret;
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1ctl__JII
+ (JNIEnv *jniEnv, jclass clazz, jlong state, jint request, jint value)
+{
+ return speex_encoder_ctl((void *) state, request, &value);
+}
+
+JNIEXPORT void JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1destroy
+ (JNIEnv *jniEnv, jclass clazz, jlong state)
+{
+ speex_encoder_destroy((void *) state);
+}
+
+JNIEXPORT jlong JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1init
+ (JNIEnv *jniEnv, jclass clazz, jlong mode)
+{
+ return (jlong) speex_encoder_init((SpeexMode *) mode);
+}
+
+JNIEXPORT jlong JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1lib_1get_1mode
+ (JNIEnv *jniEnv, jclass clazz, jint mode)
+{
+ return (jlong) speex_lib_get_mode(mode);
+}
+
+JNIEXPORT void JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1destroy
+ (JNIEnv *jniENv, jclass clazz, jlong state)
+{
+ speex_resampler_destroy((SpeexResamplerState *) state);
+}
+
+JNIEXPORT jlong JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1init
+ (JNIEnv *jniEnv, jclass clazz,
+ jint nb_channels, jint in_rate, jint out_rate, jint quality, jlong err)
+{
+ return
+ (jlong)
+ speex_resampler_init(
+ nb_channels,
+ in_rate, out_rate,
+ quality,
+ (int *) err);
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1process_1interleaved_1int
+ (JNIEnv *jniEnv, jclass clazz,
+ jlong state,
+ jbyteArray in, jint inOffset, jint in_len,
+ jbyteArray out, jint outOffset, jint out_len)
+{
+ jbyte *inPtr = (*jniEnv)->GetPrimitiveArrayCritical(jniEnv, in, NULL);
+ jint ret;
+
+ if (inPtr)
+ {
+ jbyte *outPtr = (*jniEnv)->GetPrimitiveArrayCritical(jniEnv, out, NULL);
+
+ if (outPtr)
+ {
+ spx_uint32_t _in_len = in_len;
+ spx_uint32_t _out_len = out_len;
+
+ ret
+ = speex_resampler_process_interleaved_int(
+ (SpeexResamplerState *) state,
+ (spx_int16_t *) (inPtr + inOffset),
+ &_in_len,
+ (spx_int16_t *) (outPtr + outOffset),
+ &_out_len);
+ (*jniEnv)->ReleasePrimitiveArrayCritical(jniEnv, out, outPtr, 0);
+
+ /*
+ * speex_resampler_process_interleaved_int is supposed to return the
+ * number of samples which have been written but it doesn't seem to
+ * do it and instead returns zero.
+ */
+ ret = _out_len;
+ }
+ else
+ ret = 0;
+ (*jniEnv)->ReleasePrimitiveArrayCritical(jniEnv, in, inPtr, JNI_ABORT);
+ }
+ else
+ ret = 0;
+ return ret;
+}
+
+JNIEXPORT jint JNICALL
+Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1set_1rate
+ (JNIEnv *jniEnv, jclass clazz, jlong state, jint in_rate, jint out_rate)
+{
+ return
+ speex_resampler_set_rate(
+ (SpeexResamplerState *) state,
+ in_rate, out_rate);
+}
diff --git a/src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.h b/src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.h
new file mode 100644
index 0000000..9c9eef8
--- /dev/null
+++ b/src/native/speex/net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex.h
@@ -0,0 +1,189 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex */
+
+#ifndef _Included_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+#define _Included_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_bits_destroy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1destroy
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_bits_init
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1init
+ (JNIEnv *, jclass);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_bits_nbytes
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1nbytes
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_bits_read_from
+ * Signature: (J[BII)V
+ */
+JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1read_1from
+ (JNIEnv *, jclass, jlong, jbyteArray, jint, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_bits_remaining
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1remaining
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_bits_reset
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1reset
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_bits_write
+ * Signature: (J[BII)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1bits_1write
+ (JNIEnv *, jclass, jlong, jbyteArray, jint, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_decode_int
+ * Signature: (JJ[BI)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decode_1int
+ (JNIEnv *, jclass, jlong, jlong, jbyteArray, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_decoder_ctl
+ * Signature: (JI)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1ctl__JI
+ (JNIEnv *, jclass, jlong, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_decoder_ctl
+ * Signature: (JII)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1ctl__JII
+ (JNIEnv *, jclass, jlong, jint, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_decoder_destroy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1destroy
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_decoder_init
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1decoder_1init
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_encode_int
+ * Signature: (J[BIJ)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encode_1int
+ (JNIEnv *, jclass, jlong, jbyteArray, jint, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_encoder_ctl
+ * Signature: (JI)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1ctl__JI
+ (JNIEnv *, jclass, jlong, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_encoder_ctl
+ * Signature: (JII)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1ctl__JII
+ (JNIEnv *, jclass, jlong, jint, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_encoder_destroy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1destroy
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_encoder_init
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1encoder_1init
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_lib_get_mode
+ * Signature: (I)J
+ */
+JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1lib_1get_1mode
+ (JNIEnv *, jclass, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_resampler_destroy
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1destroy
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_resampler_init
+ * Signature: (IIIIJ)J
+ */
+JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1init
+ (JNIEnv *, jclass, jint, jint, jint, jint, jlong);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_resampler_process_interleaved_int
+ * Signature: (J[BII[BII)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1process_1interleaved_1int
+ (JNIEnv *, jclass, jlong, jbyteArray, jint, jint, jbyteArray, jint, jint);
+
+/*
+ * Class: net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex
+ * Method: speex_resampler_set_rate
+ * Signature: (JII)I
+ */
+JNIEXPORT jint JNICALL Java_net_java_sip_communicator_impl_neomedia_codec_audio_speex_Speex_speex_1resampler_1set_1rate
+ (JNIEnv *, jclass, jlong, jint, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif