From 6196feb2ed60fc5969747ec649e1a30f804c25f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20Kalliom=C3=A4ki?= Date: Fri, 24 Nov 2017 11:00:04 +0100 Subject: [PATCH] Fix a bug where all wrapped codecs were considered software codecs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is not the case for fallback codecs. Bug: webrtc:7925 Change-Id: I5039d8879923a2db1e7c08bb5640763dd20ea8e7 Reviewed-on: https://webrtc-review.googlesource.com/24863 Commit-Queue: Sami Kalliomäki Reviewed-by: Magnus Jedvert Cr-Commit-Position: refs/heads/master@{#20861} --- sdk/android/api/org/webrtc/VideoEncoderFallback.java | 5 +++++ sdk/android/src/java/org/webrtc/VP8Encoder.java | 5 +++++ sdk/android/src/java/org/webrtc/VP9Encoder.java | 5 +++++ .../src/java/org/webrtc/WrappedNativeVideoEncoder.java | 8 ++++++++ sdk/android/src/jni/videoencoderfactorywrapper.cc | 6 +----- sdk/android/src/jni/wrappednativecodec.cc | 5 +++++ sdk/android/src/jni/wrappednativecodec.h | 2 ++ 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/sdk/android/api/org/webrtc/VideoEncoderFallback.java b/sdk/android/api/org/webrtc/VideoEncoderFallback.java index 6ee635104b..7894da9026 100644 --- a/sdk/android/api/org/webrtc/VideoEncoderFallback.java +++ b/sdk/android/api/org/webrtc/VideoEncoderFallback.java @@ -27,5 +27,10 @@ public class VideoEncoderFallback extends WrappedNativeVideoEncoder { return createNativeEncoder(fallback, primary); } + @Override + boolean isSoftwareEncoder() { + return isWrappedSoftwareEncoder(primary); + } + private static native long createNativeEncoder(VideoEncoder fallback, VideoEncoder primary); } diff --git a/sdk/android/src/java/org/webrtc/VP8Encoder.java b/sdk/android/src/java/org/webrtc/VP8Encoder.java index 232e1a8429..4157568670 100644 --- a/sdk/android/src/java/org/webrtc/VP8Encoder.java +++ b/sdk/android/src/java/org/webrtc/VP8Encoder.java @@ -12,4 +12,9 @@ package org.webrtc; class VP8Encoder extends WrappedNativeVideoEncoder { @Override native long createNativeEncoder(); + + @Override + boolean isSoftwareEncoder() { + return true; + } } diff --git a/sdk/android/src/java/org/webrtc/VP9Encoder.java b/sdk/android/src/java/org/webrtc/VP9Encoder.java index 56315c4b0c..7839ab9981 100644 --- a/sdk/android/src/java/org/webrtc/VP9Encoder.java +++ b/sdk/android/src/java/org/webrtc/VP9Encoder.java @@ -13,5 +13,10 @@ package org.webrtc; class VP9Encoder extends WrappedNativeVideoEncoder { @Override native long createNativeEncoder(); + @Override + boolean isSoftwareEncoder() { + return true; + } + static native boolean isSupported(); } diff --git a/sdk/android/src/java/org/webrtc/WrappedNativeVideoEncoder.java b/sdk/android/src/java/org/webrtc/WrappedNativeVideoEncoder.java index 287566ed9e..c41b3b0212 100644 --- a/sdk/android/src/java/org/webrtc/WrappedNativeVideoEncoder.java +++ b/sdk/android/src/java/org/webrtc/WrappedNativeVideoEncoder.java @@ -16,6 +16,8 @@ package org.webrtc; abstract class WrappedNativeVideoEncoder implements VideoEncoder { @CalledByNative abstract long createNativeEncoder(); + abstract boolean isSoftwareEncoder(); + @Override public VideoCodecStatus initEncode(Settings settings, Callback encodeCallback) { throw new UnsupportedOperationException("Not implemented."); @@ -51,6 +53,12 @@ abstract class WrappedNativeVideoEncoder implements VideoEncoder { throw new UnsupportedOperationException("Not implemented."); } + @CalledByNative + static boolean isWrappedSoftwareEncoder(VideoEncoder encoder) { + return (encoder instanceof WrappedNativeVideoEncoder) + && ((WrappedNativeVideoEncoder) encoder).isSoftwareEncoder(); + } + @CalledByNative static boolean isInstanceOf(VideoEncoder encoder) { return encoder instanceof WrappedNativeVideoEncoder; diff --git a/sdk/android/src/jni/videoencoderfactorywrapper.cc b/sdk/android/src/jni/videoencoderfactorywrapper.cc index 784b67d18a..255031320e 100644 --- a/sdk/android/src/jni/videoencoderfactorywrapper.cc +++ b/sdk/android/src/jni/videoencoderfactorywrapper.cc @@ -53,13 +53,9 @@ VideoEncoderFactory::CodecInfo VideoEncoderFactoryWrapper::QueryVideoEncoder( jobject encoder = jni->CallObjectMethod(*encoder_factory_, create_encoder_method_, j_codec_info); - jclass wrapped_native_encoder_class = - GetClass(jni, "org/webrtc/WrappedNativeVideoEncoder"); - CodecInfo codec_info; // Check if this is a wrapped native software encoder implementation. - codec_info.is_hardware_accelerated = - !jni->IsInstanceOf(encoder, wrapped_native_encoder_class); + codec_info.is_hardware_accelerated = !IsWrappedSoftwareEncoder(jni, encoder); codec_info.has_internal_source = false; return codec_info; } diff --git a/sdk/android/src/jni/wrappednativecodec.cc b/sdk/android/src/jni/wrappednativecodec.cc index e5eb63656b..27a8977a68 100644 --- a/sdk/android/src/jni/wrappednativecodec.cc +++ b/sdk/android/src/jni/wrappednativecodec.cc @@ -51,5 +51,10 @@ std::unique_ptr JavaToNativeVideoEncoder(JNIEnv* jni, return std::unique_ptr(encoder); } +bool IsWrappedSoftwareEncoder(JNIEnv* jni, jobject j_encoder) { + return Java_WrappedNativeVideoEncoder_isWrappedSoftwareEncoder(jni, + j_encoder); +} + } // namespace jni } // namespace webrtc diff --git a/sdk/android/src/jni/wrappednativecodec.h b/sdk/android/src/jni/wrappednativecodec.h index c8de4732f0..0494296028 100644 --- a/sdk/android/src/jni/wrappednativecodec.h +++ b/sdk/android/src/jni/wrappednativecodec.h @@ -32,6 +32,8 @@ std::unique_ptr JavaToNativeVideoDecoder(JNIEnv* jni, std::unique_ptr JavaToNativeVideoEncoder(JNIEnv* jni, jobject j_encoder); +bool IsWrappedSoftwareEncoder(JNIEnv* jni, jobject j_encoder); + } // namespace jni } // namespace webrtc