From 6cb76506fe6ee873a20993cb83fc38c6375a6a78 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Tue, 14 Nov 2017 13:09:12 +0100 Subject: [PATCH] Android: Don't create VP9 encoder/decoder when not supported. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the SoftwareVideoCodecFactories, don't try to create VP9 encoder or decoder if WebRTC was built without support for it. Bug: None Change-Id: I09b87fdcf798c763310af4998dbea8011843010d Reviewed-on: https://webrtc-review.googlesource.com/22924 Reviewed-by: Sami Kalliomäki Commit-Queue: Anders Carlsson Cr-Commit-Position: refs/heads/master@{#20672} --- .../org/webrtc/SoftwareVideoDecoderFactory.java | 2 +- .../org/webrtc/SoftwareVideoEncoderFactory.java | 16 +++++++++++----- sdk/android/src/java/org/webrtc/VP9Decoder.java | 2 ++ sdk/android/src/java/org/webrtc/VP9Encoder.java | 2 ++ sdk/android/src/jni/vp9codec.cc | 14 ++++++++++++++ 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java b/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java index 52c515f6c7..996c299c8d 100644 --- a/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java +++ b/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java @@ -16,7 +16,7 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory { if (codecType.equalsIgnoreCase("VP8")) { return new VP8Decoder(); } - if (codecType.equalsIgnoreCase("VP9")) { + if (codecType.equalsIgnoreCase("VP9") && VP9Decoder.isSupported()) { return new VP9Decoder(); } diff --git a/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java b/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java index 8fb112e6cf..7cc3f9c956 100644 --- a/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java +++ b/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java @@ -10,7 +10,9 @@ package org.webrtc; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; public class SoftwareVideoEncoderFactory implements VideoEncoderFactory { @Override @@ -18,7 +20,7 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory { if (info.name.equalsIgnoreCase("VP8")) { return new VP8Encoder(); } - if (info.name.equalsIgnoreCase("VP9")) { + if (info.name.equalsIgnoreCase("VP9") && VP9Encoder.isSupported()) { return new VP9Encoder(); } @@ -30,10 +32,14 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory { return supportedCodecs(); } - public static VideoCodecInfo[] supportedCodecs() { - VideoCodecInfo vp8Info = new VideoCodecInfo("VP8", new HashMap<>()); - VideoCodecInfo vp9Info = new VideoCodecInfo("VP9", new HashMap<>()); + static VideoCodecInfo[] supportedCodecs() { + List codecs = new ArrayList(); - return new VideoCodecInfo[] {vp8Info, vp9Info}; + codecs.add(new VideoCodecInfo("VP8", new HashMap<>())); + if (VP9Encoder.isSupported()) { + codecs.add(new VideoCodecInfo("VP9", new HashMap<>())); + } + + return codecs.toArray(new VideoCodecInfo[codecs.size()]); } } diff --git a/sdk/android/src/java/org/webrtc/VP9Decoder.java b/sdk/android/src/java/org/webrtc/VP9Decoder.java index 96f2086534..a01557eec0 100644 --- a/sdk/android/src/java/org/webrtc/VP9Decoder.java +++ b/sdk/android/src/java/org/webrtc/VP9Decoder.java @@ -15,5 +15,7 @@ class VP9Decoder extends WrappedNativeVideoDecoder { super(createNativeDecoder()); } + static native boolean isSupported(); + private static native long createNativeDecoder(); } diff --git a/sdk/android/src/java/org/webrtc/VP9Encoder.java b/sdk/android/src/java/org/webrtc/VP9Encoder.java index 203fcbf155..16cc34820e 100644 --- a/sdk/android/src/java/org/webrtc/VP9Encoder.java +++ b/sdk/android/src/java/org/webrtc/VP9Encoder.java @@ -15,5 +15,7 @@ class VP9Encoder extends WrappedNativeVideoEncoder { super(createNativeEncoder()); } + static native boolean isSupported(); + private static native long createNativeEncoder(); } diff --git a/sdk/android/src/jni/vp9codec.cc b/sdk/android/src/jni/vp9codec.cc index cfdb334643..599fee5087 100644 --- a/sdk/android/src/jni/vp9codec.cc +++ b/sdk/android/src/jni/vp9codec.cc @@ -23,6 +23,13 @@ JNI_FUNCTION_DECLARATION(jlong, return jlongFromPointer(VP9Encoder::Create().release()); } +JNI_FUNCTION_DECLARATION(jboolean, + VP9Encoder_isSupported, + JNIEnv* jni, + jclass) { + return VP9Encoder::IsSupported(); +} + JNI_FUNCTION_DECLARATION(jlong, VP9Decoder_createNativeDecoder, JNIEnv* jni, @@ -30,5 +37,12 @@ JNI_FUNCTION_DECLARATION(jlong, return jlongFromPointer(VP9Decoder::Create().release()); } +JNI_FUNCTION_DECLARATION(jboolean, + VP9Decoder_isSupported, + JNIEnv* jni, + jclass) { + return VP9Decoder::IsSupported(); +} + } // namespace jni } // namespace webrtc