diff --git a/.gitignore b/.gitignore index dfc265e5fd5043b02c7d5fb89f4697ae81bb7d47..3ea29586ec5243c2fd836556d7e843a4ddbb3116 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ libjitsi.jar .idea *.swp dist +*.class diff --git a/lib/native/linux-64/libjnopus.so b/lib/native/linux-64/libjnopus.so index 045fa4c9380c3edd33a2f64ea52f38de125bca99..a8d1c93ad9b1854ffd4992feabb6280ec59a0657 100755 Binary files a/lib/native/linux-64/libjnopus.so and b/lib/native/linux-64/libjnopus.so differ diff --git a/lib/native/linux/libjnopus.so b/lib/native/linux/libjnopus.so index 6fa870980561270879197d815d78ca7928b8b7d9..aa5ff67f6b29604fecc1143d8913ffd50fc8bb1a 100755 Binary files a/lib/native/linux/libjnopus.so and b/lib/native/linux/libjnopus.so differ diff --git a/lib/native/mac/libjnopus.jnilib b/lib/native/mac/libjnopus.jnilib index 72550c2d067d739a2f1019366379b6bcff8d9049..7b31380451f5d649d49d9e54efd790fea61be9d6 100755 Binary files a/lib/native/mac/libjnopus.jnilib and b/lib/native/mac/libjnopus.jnilib differ diff --git a/lib/native/windows-64/jnopus.dll b/lib/native/windows-64/jnopus.dll index 0eac2cb0529996423f9a729151b49b7f7f6ccb8f..90b5d1522d02ba63d6cb050abfc964456ce5d04e 100755 Binary files a/lib/native/windows-64/jnopus.dll and b/lib/native/windows-64/jnopus.dll differ diff --git a/lib/native/windows/jnopus.dll b/lib/native/windows/jnopus.dll index 4004023e170aa00d1c76db276c7da4e43cac0969..2fea6df13ba17cab44e83535fc9004413b14b2c1 100755 Binary files a/lib/native/windows/jnopus.dll and b/lib/native/windows/jnopus.dll differ diff --git a/src/native/build.xml b/src/native/build.xml index e8e270f623c7346288875e29297853d41d977cae..cadbf79cff9137ca1ed8e54dfac1623d95f28cf8 100644 --- a/src/native/build.xml +++ b/src/native/build.xml @@ -688,12 +688,12 @@ <compilerarg value="-Wall" /> <compilerarg value="-fPIC"/> <compilerarg value="-O2" /> - <compilerarg value="-I${opus}/include" unless="is.running.linux"/> - <compilerarg value="-I/usr/include/opus" if="is.running.linux"/> + <compilerarg value="-I${opus}/include" unless="is.running.debian"/> + <compilerarg value="-I/usr/include/opus" if="is.running.debian"/> <compilerarg value="-D_JNI_IMPLEMENTATION_" /> <linkerarg value="-Wl,-z,relro" if="is.running.debian"/> - <linkerarg value="-L${opus}/.libs" /> + <linkerarg value="-L${opus}/.libs" unless="is.running.debian"/> <!-- Linux specific flags --> <compilerarg value="-m32" if="cross_32" unless="is.running.macos" /> diff --git a/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.c b/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.c index 3ea5d8be3501017418d1bba3b186b90f6d87facb..833495903254b0bb296e0e5a47e01abd7ca8d479 100644 --- a/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.c +++ b/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.c @@ -14,7 +14,7 @@ JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_decode (JNIEnv *env, jclass clazz, jlong decoder, jbyteArray input, jint inputOffset, jint inputLength, jbyteArray output, - /* jint outputOffset, */ jint outputFrameSize, jint decodeFEC) + jint outputOffset, jint outputFrameSize, jint decodeFEC) { int ret; @@ -44,7 +44,7 @@ Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_decode (unsigned char *) (input_ ? (input_ + inputOffset) : NULL), inputLength, - (opus_int16 *) (output_ /* + outputOffset */), + (opus_int16 *) (output_ + outputOffset), outputFrameSize, decodeFEC); (*env)->ReleasePrimitiveArrayCritical(env, output, output_, 0); @@ -124,7 +124,7 @@ JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_encode (JNIEnv *env, jclass clazz, jlong encoder, jbyteArray input, jint inputOffset, jint inputFrameSize, jbyteArray output, - /* jint outputOffset, */ jint outputLength) + jint outputOffset, jint outputLength) { int ret; @@ -143,7 +143,7 @@ Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_encode (OpusEncoder *) (intptr_t) encoder, (opus_int16 *) (input_ + inputOffset), inputFrameSize, - (unsigned char *) (output_ /* + outputOffset */), + (unsigned char *) (output_ + outputOffset), outputLength); (*env)->ReleasePrimitiveArrayCritical(env, output, output_, 0); } @@ -253,6 +253,19 @@ Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_encoder_1get_1vbr_1constraint return (OPUS_OK == ret) ? x : ret; } +JNIEXPORT jint JNICALL +Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_encoder_1get_1inband_1fec + (JNIEnv *env, jclass clazz, jlong encoder) +{ + opus_int32 x; + int ret + = opus_encoder_ctl( + (OpusEncoder *) (intptr_t) encoder, + OPUS_GET_INBAND_FEC(&x)); + + return (OPUS_OK == ret) ? x : ret; +} + JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_encoder_1set_1bandwidth (JNIEnv *env, jclass clazz, jlong encoder, jint bandwidth) diff --git a/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.h b/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.h index 2e57ad5efd87b33ae9dd029b23155242aaf29a95..8122e26a68c663947d0b2cfca2c3aba62de77c6e 100644 --- a/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.h +++ b/src/native/opus/org_jitsi_impl_neomedia_codec_audio_opus_Opus.h @@ -10,10 +10,10 @@ extern "C" { /* * Class: org_jitsi_impl_neomedia_codec_audio_opus_Opus * Method: decode - * Signature: (J[BII[BII)I + * Signature: (J[BII[BIII)I */ JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_decode - (JNIEnv *, jclass, jlong, jbyteArray, jint, jint, jbyteArray, jint, jint); + (JNIEnv *, jclass, jlong, jbyteArray, jint, jint, jbyteArray, jint, jint, jint); /* * Class: org_jitsi_impl_neomedia_codec_audio_opus_Opus @@ -50,10 +50,10 @@ JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_decode /* * Class: org_jitsi_impl_neomedia_codec_audio_opus_Opus * Method: encode - * Signature: (J[BII[BI)I - */ -JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_encode - (JNIEnv *, jclass, jlong, jbyteArray, jint, jint, jbyteArray, jint); + * Signature: (J[BII[BII)I + */ + JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_codec_audio_opus_Opus_encode + (JNIEnv *, jclass, jlong, jbyteArray, jint, jint, jbyteArray, jint, jint); /* * Class: org_jitsi_impl_neomedia_codec_audio_opus_Opus diff --git a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java index b448ce5ad27f6e6130ee8418279a64b58c40a589..ccebdbe2e956466b95f843ec22c3cf6dc590949c 100644 --- a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java +++ b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java @@ -123,7 +123,7 @@ public JNIDecoder() } /** - * @see AbstractCodecExt#doClose() + * @see AbstractCodec2#doClose() */ @Override protected void doClose() @@ -144,7 +144,7 @@ protected void doClose() * * @throws ResourceUnavailableException if any of the resources that this * <tt>Codec</tt> needs to operate cannot be acquired - * @see AbstractCodecExt#doOpen() + * @see AbstractCodec2#doOpen() */ @Override protected void doOpen() @@ -168,7 +168,7 @@ protected void doOpen() * @param outBuffer output <tt>Buffer</tt> * @return <tt>BUFFER_PROCESSED_OK</tt> if <tt>inBuffer</tt> has been * successfully processed - * @see AbstractCodecExt#doProcess(Buffer, Buffer) + * @see AbstractCodec2#doProcess(Buffer, Buffer) */ @Override protected int doProcess(Buffer inBuffer, Buffer outBuffer) @@ -229,7 +229,7 @@ protected int doProcess(Buffer inBuffer, Buffer outBuffer) = Opus.decode( decoder, in, inOffset, inLength, - out, /* outOffset, */ lastFrameSizeInSamplesPerChannel, + out, outOffset, lastFrameSizeInSamplesPerChannel, /* decodeFEC */ 1); if (frameSizeInSamplesPerChannel > 0) @@ -267,7 +267,7 @@ protected int doProcess(Buffer inBuffer, Buffer outBuffer) = Opus.decode( decoder, in, inOffset, inLength, - out, /* outOffset, */ frameSizeInSamplesPerChannel, + out, outOffset, frameSizeInSamplesPerChannel, /* decodeFEC */ 0); if (frameSizeInSamplesPerChannel > 0) { diff --git a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java index 8ecaec66bea489b43d6013c617b1736e4f6129f8..12ba9fb60b84ecebd7660b2ae697fbfee0bd26a0 100644 --- a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java +++ b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java @@ -210,7 +210,7 @@ public JNIEncoder() /** * {@inheritDoc} * - * @see AbstractCodecExt#doClose() + * @see AbstractCodec2#doClose() */ @Override protected void doClose() @@ -231,7 +231,7 @@ protected void doClose() * * @throws ResourceUnavailableException if any of the resources that this * <tt>Codec</tt> needs to operate cannot be acquired - * @see AbstractCodecExt#doOpen() + * @see AbstractCodec2#doOpen() */ @Override protected void doOpen() @@ -293,10 +293,10 @@ else if("nb".equals(str)) : b == Opus.BANDWIDTH_SUPERWIDEBAND ? "swb" : b == Opus.BANDWIDTH_WIDEBAND ? "wb" : b == Opus.BANDWIDTH_MEDIUMBAND ? "mb" - : "nb") + - ", bitrate " + Opus.encoder_get_bitrate(encoder) + ", DTX " + - Opus.encoder_get_dtx(encoder) + ", FEC " + useFecConfig); - // TODO Add Opus.encoder_get_inband_fec(). + : "nb") + + ", bitrate " + Opus.encoder_get_bitrate(encoder) + + ", DTX " + Opus.encoder_get_dtx(encoder) + + ", FEC " + Opus.encoder_get_inband_fec(encoder)); } } @@ -309,7 +309,7 @@ else if("nb".equals(str)) * be written * @return <tt>BUFFER_PROCESSED_OK</tt> if the specified <tt>inBuffer</tt> * has been processed successfully - * @see AbstractCodecExt#doProcess(Buffer, Buffer) + * @see AbstractCodec2#doProcess(Buffer, Buffer) */ @Override protected int doProcess(Buffer inBuffer, Buffer outBuffer) @@ -401,7 +401,7 @@ else if (inLength < frameSizeInBytes) = Opus.encode( encoder, in, inOffset, frameSizeInSamplesPerChannel, - out, /* 0, */ out.length); + out, 0, out.length); if (outLength < 0) // error from opus_encode return BUFFER_PROCESSED_FAILED; diff --git a/src/org/jitsi/impl/neomedia/codec/audio/opus/Opus.java b/src/org/jitsi/impl/neomedia/codec/audio/opus/Opus.java index e739e9627698c1546b92ed5a125d66c742a00fbc..d7bcafa4adea366b3a8ddc3280c92f9b0edd72cd 100644 --- a/src/org/jitsi/impl/neomedia/codec/audio/opus/Opus.java +++ b/src/org/jitsi/impl/neomedia/codec/audio/opus/Opus.java @@ -109,7 +109,7 @@ public static void assertOpusIsFunctional() public static native int decode( long decoder, byte[] input, int inputOffset, int inputLength, - byte[] output, /* int outputOffset, */ int outputFrameSize, + byte[] output, int outputOffset, int outputFrameSize, int decodeFEC); /** @@ -170,7 +170,7 @@ public static native int decoder_get_nb_samples( public static native int encode( long encoder, byte[] input, int inputOffset, int inputFrameSize, - byte[] output, /* int outputOffset, */ int outputLength); + byte[] output, int outputOffset, int outputLength); /** * Creates an OpusEncoder structure, returns a pointer to it casted to long. @@ -250,6 +250,16 @@ public static native int encode( */ public static native int encoder_get_vbr_constraint(long encoder); + /** + * Wrapper around the native <tt>opus_encoder_ctl</tt> function. Returns + * the current inband FEC encoder setting. + * + * @param encoder The encoder to use + * + * @return the current inband FEC encoder setting. + */ + public static native int encoder_get_inband_fec(long encoder); + /** * Wrapper around the native <tt>opus_encoder_ctl</tt> function. Sets the * encoder audio bandwidth.