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..1c8a2effd54ca1b37aef650b2d7f6a2b8b8d5f94 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_INBAD_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..ec6b51c389b75e4ecb9768ec57b98fe7205cbd77 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() @@ -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.