diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index b3a7894a9e..e6f49442e7 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -143,6 +143,7 @@ rtc_static_library("video_jni") { "src/jni/videodecoderwrapper.h", "src/jni/videoencoderfactorywrapper.cc", "src/jni/videoencoderfactorywrapper.h", + "src/jni/videoencoderfallback.cc", "src/jni/videoencoderwrapper.cc", "src/jni/videoencoderwrapper.h", "src/jni/videofilerenderer_jni.cc", @@ -491,6 +492,7 @@ rtc_android_library("libjingle_peerconnection_java") { "api/org/webrtc/VideoDecoderFallback.java", "api/org/webrtc/VideoEncoder.java", "api/org/webrtc/VideoEncoderFactory.java", + "api/org/webrtc/VideoEncoderFallback.java", "api/org/webrtc/VideoFileRenderer.java", "api/org/webrtc/VideoFrame.java", "api/org/webrtc/VideoFrameDrawer.java", diff --git a/sdk/android/api/org/webrtc/VideoEncoderFallback.java b/sdk/android/api/org/webrtc/VideoEncoderFallback.java new file mode 100644 index 0000000000..0072c136ad --- /dev/null +++ b/sdk/android/api/org/webrtc/VideoEncoderFallback.java @@ -0,0 +1,22 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +package org.webrtc; + +/** + * A combined video encoder that falls back on a secondary encoder if the primary encoder fails. + */ +public class VideoEncoderFallback extends WrappedNativeVideoEncoder { + public VideoEncoderFallback(VideoEncoder fallback, VideoEncoder primary) { + super(createNativeEncoder(fallback, primary)); + } + + private static native long createNativeEncoder(VideoEncoder fallback, VideoEncoder primary); +} diff --git a/sdk/android/src/jni/videodecoderfactorywrapper.cc b/sdk/android/src/jni/videodecoderfactorywrapper.cc index f976584a1a..cda9c4b483 100644 --- a/sdk/android/src/jni/videodecoderfactorywrapper.cc +++ b/sdk/android/src/jni/videodecoderfactorywrapper.cc @@ -35,7 +35,7 @@ std::unique_ptr VideoDecoderFactoryWrapper::CreateVideoDecoder( jstring name = JavaStringFromStdString(jni, format.name); jobject decoder = jni->CallObjectMethod(*decoder_factory_, create_decoder_method_, name); - return decoder != nullptr ? WrapOrUnwrapVideoDecoder(jni, decoder) : nullptr; + return decoder != nullptr ? JavaToNativeVideoDecoder(jni, decoder) : nullptr; } std::vector VideoDecoderFactoryWrapper::GetSupportedFormats() diff --git a/sdk/android/src/jni/videodecoderfallback.cc b/sdk/android/src/jni/videodecoderfallback.cc index 594cde24cc..92ad6ad9a5 100644 --- a/sdk/android/src/jni/videodecoderfallback.cc +++ b/sdk/android/src/jni/videodecoderfallback.cc @@ -24,9 +24,9 @@ JNI_FUNCTION_DECLARATION(jlong, jobject j_fallback_decoder, jobject j_primary_decoder) { std::unique_ptr fallback_decoder = - WrapOrUnwrapVideoDecoder(jni, j_fallback_decoder); + JavaToNativeVideoDecoder(jni, j_fallback_decoder); std::unique_ptr primary_decoder = - WrapOrUnwrapVideoDecoder(jni, j_primary_decoder); + JavaToNativeVideoDecoder(jni, j_primary_decoder); VideoDecoderSoftwareFallbackWrapper* nativeWrapper = new VideoDecoderSoftwareFallbackWrapper(std::move(fallback_decoder), diff --git a/sdk/android/src/jni/videoencoderfactorywrapper.cc b/sdk/android/src/jni/videoencoderfactorywrapper.cc index 3171a4e032..784b67d18a 100644 --- a/sdk/android/src/jni/videoencoderfactorywrapper.cc +++ b/sdk/android/src/jni/videoencoderfactorywrapper.cc @@ -41,7 +41,7 @@ std::unique_ptr VideoEncoderFactoryWrapper::CreateVideoEncoder( jobject j_codec_info = SdpVideoFormatToVideoCodecInfo(jni, format); jobject encoder = jni->CallObjectMethod(*encoder_factory_, create_encoder_method_, j_codec_info); - return encoder != nullptr ? WrapOrUnwrapVideoEncoder(jni, encoder) : nullptr; + return encoder != nullptr ? JavaToNativeVideoEncoder(jni, encoder) : nullptr; } VideoEncoderFactory::CodecInfo VideoEncoderFactoryWrapper::QueryVideoEncoder( diff --git a/sdk/android/src/jni/videoencoderfallback.cc b/sdk/android/src/jni/videoencoderfallback.cc new file mode 100644 index 0000000000..b151f15fed --- /dev/null +++ b/sdk/android/src/jni/videoencoderfallback.cc @@ -0,0 +1,39 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include + +#include "media/engine/videoencodersoftwarefallbackwrapper.h" +#include "sdk/android/src/jni/jni_helpers.h" +#include "sdk/android/src/jni/wrappednativecodec.h" + +namespace webrtc { +namespace jni { + +JNI_FUNCTION_DECLARATION(jlong, + VideoEncoderFallback_createNativeEncoder, + JNIEnv* jni, + jclass, + jobject j_fallback_encoder, + jobject j_primary_encoder) { + std::unique_ptr fallback_encoder = + JavaToNativeVideoEncoder(jni, j_fallback_encoder); + std::unique_ptr primary_encoder = + JavaToNativeVideoEncoder(jni, j_primary_encoder); + + VideoEncoderSoftwareFallbackWrapper* nativeWrapper = + new VideoEncoderSoftwareFallbackWrapper(std::move(fallback_encoder), + std::move(primary_encoder)); + + return jlongFromPointer(nativeWrapper); +} + +} // namespace jni +} // namespace webrtc diff --git a/sdk/android/src/jni/wrappednativecodec.cc b/sdk/android/src/jni/wrappednativecodec.cc index 3cdaf7c623..a29be73def 100644 --- a/sdk/android/src/jni/wrappednativecodec.cc +++ b/sdk/android/src/jni/wrappednativecodec.cc @@ -20,7 +20,7 @@ namespace webrtc { namespace jni { -std::unique_ptr WrapOrUnwrapVideoDecoder(JNIEnv* jni, +std::unique_ptr JavaToNativeVideoDecoder(JNIEnv* jni, jobject j_decoder) { jclass wrapped_native_decoder_class = GetClass(jni, "org/webrtc/WrappedNativeVideoDecoder"); @@ -37,7 +37,7 @@ std::unique_ptr WrapOrUnwrapVideoDecoder(JNIEnv* jni, return std::unique_ptr(decoder); } -std::unique_ptr WrapOrUnwrapVideoEncoder(JNIEnv* jni, +std::unique_ptr JavaToNativeVideoEncoder(JNIEnv* jni, jobject j_encoder) { jclass wrapped_native_encoder_class = GetClass(jni, "org/webrtc/WrappedNativeVideoEncoder"); diff --git a/sdk/android/src/jni/wrappednativecodec.h b/sdk/android/src/jni/wrappednativecodec.h index 222610a403..c8de4732f0 100644 --- a/sdk/android/src/jni/wrappednativecodec.h +++ b/sdk/android/src/jni/wrappednativecodec.h @@ -23,13 +23,13 @@ namespace jni { /* If the j_decoder is a wrapped native decoder, unwrap it. If it is not, * wrap it in a VideoDecoderWrapper. */ -std::unique_ptr WrapOrUnwrapVideoDecoder(JNIEnv* jni, +std::unique_ptr JavaToNativeVideoDecoder(JNIEnv* jni, jobject j_decoder); /* If the j_encoder is a wrapped native encoder, unwrap it. If it is not, * wrap it in a VideoEncoderWrapper. */ -std::unique_ptr WrapOrUnwrapVideoEncoder(JNIEnv* jni, +std::unique_ptr JavaToNativeVideoEncoder(JNIEnv* jni, jobject j_encoder); } // namespace jni