From 18c93abcb38b7b348239d4781fc6d13465cf6379 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 29 May 2022 22:21:15 -0500 Subject: [PATCH] Submit fused IDR frames on decoders that support adaptive playback even if they are blocked from using it --- .../video/MediaCodecDecoderRenderer.java | 8 +++++--- .../binding/video/MediaCodecHelper.java | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 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 92c95174..871d616c 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -49,7 +49,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C private MediaCodec videoDecoder; private Thread rendererThread; private boolean needsSpsBitstreamFixup, isExynos4; - private boolean adaptivePlayback, directSubmit; + private boolean adaptivePlayback, directSubmit, fusedIdrFrame; private boolean constrainedHighProfile; private boolean refFrameInvalidationAvc, refFrameInvalidationHevc; private boolean refFrameInvalidationActive; @@ -294,6 +294,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C } adaptivePlayback = MediaCodecHelper.decoderSupportsAdaptivePlayback(selectedDecoderInfo, mimeType); + fusedIdrFrame = MediaCodecHelper.decoderSupportsFusedIdrFrame(selectedDecoderInfo, mimeType); // Codecs have been known to throw all sorts of crazy runtime exceptions // due to implementation problems @@ -912,9 +913,9 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C numPpsIn++; // If this is the first CSD blob or we aren't supporting - // adaptive playback, we will submit the CSD blob in a + // fused IDR frames, we will submit the CSD blob in a // separate input buffer. - if (!submittedCsd || !adaptivePlayback) { + if (!submittedCsd || !fusedIdrFrame) { inputBufferIndex = dequeueInputBuffer(); if (inputBufferIndex < 0) { // We're being torn down now @@ -1213,6 +1214,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C str += "Consecutive crashes: "+renderer.consecutiveCrashCount+"\n"; str += "RFI active: "+renderer.refFrameInvalidationActive+"\n"; str += "Using modern SPS patching: "+(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)+"\n"; + str += "Fused IDR frames: "+renderer.fusedIdrFrame+"\n"; str += "Video dimensions: "+renderer.initialWidth+"x"+renderer.initialHeight+"\n"; str += "FPS target: "+renderer.refreshRate+"\n"; str += "Bitrate: "+renderer.prefs.bitrate+" Kbps \n"; 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 b76e1147..809ae80a 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java @@ -425,6 +425,25 @@ public class MediaCodecHelper { } } + public static boolean decoderSupportsFusedIdrFrame(MediaCodecInfo decoderInfo, String mimeType) { + // If adaptive playback is supported, we can submit new CSD together with a keyframe + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + try { + if (decoderInfo.getCapabilitiesForType(mimeType). + isFeatureSupported(CodecCapabilities.FEATURE_AdaptivePlayback)) + { + LimeLog.info("Decoder supports fused IDR frames (FEATURE_AdaptivePlayback)"); + return true; + } + } catch (Exception e) { + // Tolerate buggy codecs + e.printStackTrace(); + } + } + + return false; + } + public static boolean decoderSupportsAdaptivePlayback(MediaCodecInfo decoderInfo, String mimeType) { // Possibly enable adaptive playback on KitKat and above if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {