From bfa5a6349e362d1770afd086d74d933bb3a640f7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 21 Nov 2017 19:27:08 -0800 Subject: [PATCH] Ensure MediaCodecHelper is initialized before evaluating codecs --- .../limelight/binding/video/MediaCodecHelper.java | 15 +++++++++++++++ .../com/limelight/preferences/StreamSettings.java | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java b/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java index ba22475c..eb9fd900 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java @@ -38,6 +38,7 @@ public class MediaCodecHelper { private static final List refFrameInvalidationHevcPrefixes; private static boolean isLowEndSnapdragon = false; + private static boolean initialized = false; static { directSubmitPrefixes = new LinkedList<>(); @@ -171,6 +172,10 @@ public class MediaCodecHelper { } public static void initialize(Context context, String glRenderer) { + if (initialized) { + return; + } + ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ConfigurationInfo configInfo = activityManager.getDeviceConfigurationInfo(); @@ -214,9 +219,15 @@ public class MediaCodecHelper { blacklistedDecoderPrefixes.add("OMX.qcom.video.decoder.hevc"); } } + + initialized = true; } private static boolean isDecoderInList(List decoderList, String decoderName) { + if (!initialized) { + throw new IllegalStateException("MediaCodecHelper must be initialized before use"); + } + for (String badPrefix : decoderList) { if (decoderName.length() >= badPrefix.length()) { String prefix = decoderName.substring(0, badPrefix.length()); @@ -373,6 +384,10 @@ public class MediaCodecHelper { // This is a different algorithm than the other findXXXDecoder functions, // because we want to evaluate the decoders in our list's order // rather than MediaCodecList's order + + if (!initialized) { + throw new IllegalStateException("MediaCodecHelper must be initialized before use"); + } for (String preferredDecoder : preferredDecoders) { for (MediaCodecInfo codecInfo : getMediaCodecList()) { diff --git a/app/src/main/java/com/limelight/preferences/StreamSettings.java b/app/src/main/java/com/limelight/preferences/StreamSettings.java index 00ceeb71..b71f7642 100644 --- a/app/src/main/java/com/limelight/preferences/StreamSettings.java +++ b/app/src/main/java/com/limelight/preferences/StreamSettings.java @@ -134,6 +134,10 @@ public class StreamSettings extends Activity { } } + // This must be called to do runtime initialization before calling functions that evaluate + // decoder lists. + MediaCodecHelper.initialize(getContext(), GlPreferences.readPreferences(getContext()).glRenderer); + MediaCodecInfo avcDecoder = MediaCodecHelper.findProbableSafeDecoder("video/avc", -1); MediaCodecInfo hevcDecoder = MediaCodecHelper.findProbableSafeDecoder("video/hevc", -1);