From 9857017b22e052735acaea4d0c0c41a320188bec Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 21 Mar 2014 20:54:33 -0400 Subject: [PATCH] Dump decoders before starting for logging purposes. Remove the software decoders from the blacklist since they are properly detected by the high profile check now. --- .../video/MediaCodecDecoderRenderer.java | 53 ++++++++++++------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index adf54d76..911787ea 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -33,9 +33,9 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { static { blacklistedDecoderPrefixes = new LinkedList(); - blacklistedDecoderPrefixes.add("omx.google"); + + // TI's decoder technically supports high profile but doesn't work for some reason blacklistedDecoderPrefixes.add("omx.TI"); - blacklistedDecoderPrefixes.add("AVCDecoder"); } static { @@ -60,34 +60,44 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { return false; } - - public static MediaCodecInfo findSafeDecoder() { - + + public static void dumpDecoders() { for (int i = 0; i < MediaCodecList.getCodecCount(); i++) { MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i); - boolean badCodec = false; // Skip encoders if (codecInfo.isEncoder()) { continue; } - for (String badPrefix : blacklistedDecoderPrefixes) { - String name = codecInfo.getName(); - if (name.length() >= badPrefix.length()) { - String prefix = name.substring(0, badPrefix.length()); - if (prefix.equalsIgnoreCase(badPrefix)) { - badCodec = true; - break; - } + LimeLog.info("Decoder: "+codecInfo.getName()); + for (String type : codecInfo.getSupportedTypes()) { + LimeLog.info("\t"+type); + CodecCapabilities caps = codecInfo.getCapabilitiesForType(type); + + for (CodecProfileLevel profile : caps.profileLevels) { + LimeLog.info("\t\t"+profile.profile+" "+profile.level); } } - - if (badCodec) { - LimeLog.info("Blacklisted decoder: "+codecInfo.getName()); + } + } + + public static MediaCodecInfo findSafeDecoder() { + for (int i = 0; i < MediaCodecList.getCodecCount(); i++) { + MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i); + + // Skip encoders + if (codecInfo.isEncoder()) { continue; } + // Check for explicitly blacklisted decoders + if (isDecoderInList(blacklistedDecoderPrefixes, codecInfo.getName())) { + LimeLog.info("Skipping blacklisted decoder: "+codecInfo.getName()); + continue; + } + + // Find a decoder that supports H.264 high profile for (String mime : codecInfo.getSupportedTypes()) { if (mime.equalsIgnoreCase("video/avc")) { LimeLog.info("Examining decoder capabilities of "+codecInfo.getName()); @@ -96,12 +106,13 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { for (CodecProfileLevel profile : caps.profileLevels) { if (profile.profile == CodecProfileLevel.AVCProfileHigh) { LimeLog.info("Decoder "+codecInfo.getName()+" supports high profile"); - return codecInfo; + LimeLog.info("Selected decoder: "+codecInfo.getName()); + return codecInfo; + } + } } } } - } - } return null; } @@ -110,6 +121,8 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { this.redrawRate = redrawRate; + dumpDecoders(); + MediaCodecInfo safeDecoder = findSafeDecoder(); if (safeDecoder != null) { videoDecoder = MediaCodec.createByCodecName(safeDecoder.getName());