diff options
author | Lyubomir Marinov <lyubomir.marinov@jitsi.org> | 2010-06-14 17:47:31 +0000 |
---|---|---|
committer | Lyubomir Marinov <lyubomir.marinov@jitsi.org> | 2010-06-14 17:47:31 +0000 |
commit | 60bbb1d4bf4858416d930ecbc24fb4b79a6197b8 (patch) | |
tree | 5c7bb8d4739b84dff4a96a55486a640bf71eacdf /src/native | |
parent | 971cc0ecee7f02f0c4b20db7a101e80d8e9ddbf4 (diff) | |
download | jitsi-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')
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 |