From 0c79d756a4976d9c2f2bf95a5382cf5a4fbd322a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 19 Apr 2021 22:44:17 -0500 Subject: [PATCH] Add more specific problem text to the decoder exceptions --- .../video/MediaCodecDecoderRenderer.java | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 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 b778ceba..213b855e 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -84,6 +84,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { private int numSpsIn; private int numPpsIn; private int numVpsIn; + private int numFramesIn; + private int numFramesOut; private MediaCodecInfo findAvcDecoder() { MediaCodecInfo decoder = MediaCodecHelper.findProbableSafeDecoder("video/avc", MediaCodecInfo.CodecProfileLevel.AVCProfileHigh); @@ -430,10 +432,14 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { long presentationTimeUs = info.presentationTimeUs; int lastIndex = outIndex; + numFramesOut++; + // Get the last output buffer in the queue while ((outIndex = videoDecoder.dequeueOutputBuffer(info, 0)) >= 0) { videoDecoder.releaseOutputBuffer(lastIndex, false); + numFramesOut++; + lastIndex = outIndex; presentationTimeUs = info.presentationTimeUs; } @@ -895,6 +901,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { submitCsdNextCall = false; } + + numFramesIn++; } if (decodeUnitLength > buf.limit() - buf.position()) { @@ -1040,8 +1048,31 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { } private String generateText(MediaCodecDecoderRenderer renderer, Exception originalException, ByteBuffer currentBuffer, int currentCodecFlags) { - String str = ""; + String str; + if (renderer.numVpsIn == 0 && renderer.numSpsIn == 0 && renderer.numPpsIn == 0) { + str = "PreSPSError"; + } + else if (renderer.numSpsIn > 0 && renderer.numPpsIn == 0) { + str = "PrePPSError"; + } + else if (renderer.numPpsIn > 0 && renderer.numFramesIn == 0) { + str = "PreIFrameError"; + } + else if (renderer.numFramesIn > 0 && renderer.outputFormat == null) { + str = "PreOutputConfigError"; + } + else if (renderer.outputFormat != null && renderer.numFramesOut == 0) { + str = "PreOutputError"; + } + else if (renderer.numFramesOut <= renderer.refreshRate * 30) { + str = "EarlyOutputError"; + } + else { + str = "ErrorWhileStreaming"; + } + + str += "\n"; str += "Format: "+String.format("%x", renderer.videoFormat)+"\n"; str += "AVC Decoder: "+((renderer.avcDecoder != null) ? renderer.avcDecoder.getName():"(none)")+"\n"; str += "HEVC Decoder: "+((renderer.hevcDecoder != null) ? renderer.hevcDecoder.getName():"(none)")+"\n"; @@ -1082,7 +1113,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { str += "Video dimensions: "+renderer.initialWidth+"x"+renderer.initialHeight+"\n"; str += "FPS target: "+renderer.refreshRate+"\n"; str += "Bitrate: "+renderer.prefs.bitrate+" Kbps \n"; - str += "In stats: "+renderer.numVpsIn+", "+renderer.numSpsIn+", "+renderer.numPpsIn+"\n"; + str += "CSD stats: "+renderer.numVpsIn+", "+renderer.numSpsIn+", "+renderer.numPpsIn+"\n"; + str += "Frames in-out: "+renderer.numFramesIn+", "+renderer.numFramesOut+"\n"; str += "Total frames received: "+renderer.globalVideoStats.totalFramesReceived+"\n"; str += "Total frames rendered: "+renderer.globalVideoStats.totalFramesRendered+"\n"; str += "Frame losses: "+renderer.globalVideoStats.framesLost+" in "+renderer.globalVideoStats.frameLossEvents+" loss events\n";