From f207a3f6d18d80b2d76f839d162ec47ace908c06 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 18 Jun 2022 10:35:12 -0500 Subject: [PATCH] Use areSizeAndRateSupported() as a last resort if no performance data is available --- .../video/MediaCodecDecoderRenderer.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 78988509..da34c059 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -15,6 +15,7 @@ import com.limelight.nvstream.av.video.VideoDecoderRenderer; import com.limelight.nvstream.jni.MoonBridge; import com.limelight.preferences.PreferenceConfiguration; +import android.annotation.TargetApi; import android.content.Context; import android.media.MediaCodec; import android.media.MediaCodecInfo; @@ -106,7 +107,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C return decoder; } - private Boolean decoderCanMeetPerformancePoint(MediaCodecInfo.VideoCapabilities caps, PreferenceConfiguration prefs) { + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private boolean decoderCanMeetPerformancePoint(MediaCodecInfo.VideoCapabilities caps, PreferenceConfiguration prefs) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { MediaCodecInfo.VideoCapabilities.PerformancePoint targetPerfPoint = new MediaCodecInfo.VideoCapabilities.PerformancePoint(prefs.width, prefs.height, prefs.fps); List perfPoints = caps.getSupportedPerformancePoints(); @@ -137,7 +139,10 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C } } - return null; + // As a last resort, we will use areSizeAndRateSupported() which is explicitly NOT a + // performance metric, but it can work at least for the purpose of determining if + // the codec is going to die when given a stream with the specified settings. + return caps.areSizeAndRateSupported(prefs.width, prefs.height, prefs.fps); } private boolean decoderCanMeetPerformancePointWithHevcAndNotAvc(MediaCodecInfo avcDecoderInfo, MediaCodecInfo hevcDecoderInfo, PreferenceConfiguration prefs) { @@ -145,15 +150,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C MediaCodecInfo.VideoCapabilities avcCaps = avcDecoderInfo.getCapabilitiesForType("video/avc").getVideoCapabilities(); MediaCodecInfo.VideoCapabilities hevcCaps = hevcDecoderInfo.getCapabilitiesForType("video/hevc").getVideoCapabilities(); - Boolean avcCanMeetPP = decoderCanMeetPerformancePoint(avcCaps, prefs); - Boolean hevcCanMeetPP = decoderCanMeetPerformancePoint(hevcCaps, prefs); - - // If one or both codecs lack performance data, don't do anything - if (avcCanMeetPP == null || hevcCanMeetPP == null) { - return false; - } - - return !avcCanMeetPP && hevcCanMeetPP; + return !decoderCanMeetPerformancePoint(avcCaps, prefs) && decoderCanMeetPerformancePoint(hevcCaps, prefs); } else { // No performance data