Fix a bug where all wrapped codecs were considered software codecs.

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 <sakal@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20861}
diff --git a/sdk/android/api/org/webrtc/VideoEncoderFallback.java b/sdk/android/api/org/webrtc/VideoEncoderFallback.java
index 6ee6351..7894da9 100644
--- a/sdk/android/api/org/webrtc/VideoEncoderFallback.java
+++ b/sdk/android/api/org/webrtc/VideoEncoderFallback.java
@@ -27,5 +27,10 @@
     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 232e1a8..4157568 100644
--- a/sdk/android/src/java/org/webrtc/VP8Encoder.java
+++ b/sdk/android/src/java/org/webrtc/VP8Encoder.java
@@ -12,4 +12,9 @@
 
 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 56315c4..7839ab9 100644
--- a/sdk/android/src/java/org/webrtc/VP9Encoder.java
+++ b/sdk/android/src/java/org/webrtc/VP9Encoder.java
@@ -13,5 +13,10 @@
 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 287566e..c41b3b0 100644
--- a/sdk/android/src/java/org/webrtc/WrappedNativeVideoEncoder.java
+++ b/sdk/android/src/java/org/webrtc/WrappedNativeVideoEncoder.java
@@ -16,6 +16,8 @@
 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.");
@@ -52,6 +54,12 @@
   }
 
   @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 784b67d..2550313 100644
--- a/sdk/android/src/jni/videoencoderfactorywrapper.cc
+++ b/sdk/android/src/jni/videoencoderfactorywrapper.cc
@@ -53,13 +53,9 @@
   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 e5eb636..27a8977 100644
--- a/sdk/android/src/jni/wrappednativecodec.cc
+++ b/sdk/android/src/jni/wrappednativecodec.cc
@@ -51,5 +51,10 @@
   return std::unique_ptr<VideoEncoder>(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 c8de473..0494296 100644
--- a/sdk/android/src/jni/wrappednativecodec.h
+++ b/sdk/android/src/jni/wrappednativecodec.h
@@ -32,6 +32,8 @@
 std::unique_ptr<VideoEncoder> JavaToNativeVideoEncoder(JNIEnv* jni,
                                                        jobject j_encoder);
 
+bool IsWrappedSoftwareEncoder(JNIEnv* jni, jobject j_encoder);
+
 }  // namespace jni
 }  // namespace webrtc