From 426b3c85222dd00a74a0a76f6bcdbed8ae8bad80 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 28 Sep 2014 14:17:31 -0700 Subject: [PATCH] Prefer Samsung's OMX.SEC.AVC.Decoder if it's in the list of decoders --- .../video/MediaCodecDecoderRenderer.java | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index cb4002e6..2a96821c 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -44,11 +44,20 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { private int numPpsIn; private int numIframeIn; + public static final List preferredDecoders; + public static final List blacklistedDecoderPrefixes; public static final List spsFixupBitstreamFixupDecoderPrefixes; public static final List spsFixupNumRefFixupDecoderPrefixes; public static final List whitelistedAdaptiveResolutionPrefixes; + static { + preferredDecoders = new LinkedList(); + + // This is the most reliable of Samsung's decoders + preferredDecoders.add("OMX.SEC.AVC.Decoder"); + } + static { blacklistedDecoderPrefixes = new LinkedList(); @@ -158,6 +167,31 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { return str; } + private static MediaCodecInfo findPreferredDecoder() { + // 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 + + for (String preferredDecoder : preferredDecoders) { + for (int i = 0; i < MediaCodecList.getCodecCount(); i++) { + MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i); + + // Skip encoders + if (codecInfo.isEncoder()) { + continue; + } + + // Check for preferred decoders + if (preferredDecoder.equalsIgnoreCase(codecInfo.getName())) { + LimeLog.info("Preferred decoder choice is "+codecInfo.getName()); + return codecInfo; + } + } + } + + return null; + } + private static MediaCodecInfo findFirstDecoder() { for (int i = 0; i < MediaCodecList.getCodecCount(); i++) { MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i); @@ -186,7 +220,13 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } public static MediaCodecInfo findProbableSafeDecoder() { - // First look for decoders we know are safe + // First look for a preferred decoder by name + MediaCodecInfo info = findPreferredDecoder(); + if (info != null) { + return info; + } + + // Now look for decoders we know are safe try { // If this function completes, it will determine if the decoder is safe return findKnownSafeDecoder();