diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index e1ed85ac..d582464a 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -595,7 +595,10 @@ public class Game extends Activity implements SurfaceHolder.Callback, // Add the video codec to the post-stream toast if (message != null) { - if (videoFormat == MoonBridge.VIDEO_FORMAT_H265) { + if (videoFormat == MoonBridge.VIDEO_FORMAT_H265_MAIN10) { + message += " [H.265 HDR]"; + } + else if (videoFormat == MoonBridge.VIDEO_FORMAT_H265) { message += " [H.265]"; } else if (videoFormat == MoonBridge.VIDEO_FORMAT_H264) { 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 7c3500b9..51f9437a 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -55,6 +55,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { private boolean reportedCrash; private int consecutiveCrashCount; private String glRenderer; + private boolean foreground = true; private boolean needsBaselineSpsHack; private SeqParameterSet savedSps; @@ -201,6 +202,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { public void notifyVideoForeground() { startSpinnerThreads(); + foreground = true; } public void notifyVideoBackground() { @@ -208,6 +210,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { // don't wait for them to terminate to avoid // delaying the state transition signalSpinnerStop(); + foreground = false; } public int getActiveVideoFormat() { @@ -224,7 +227,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { String mimeType; String selectedDecoderName; - if (videoFormat == MoonBridge.VIDEO_FORMAT_H264) { + if ((videoFormat & MoonBridge.VIDEO_FORMAT_MASK_H264) != 0) { mimeType = "video/avc"; selectedDecoderName = avcDecoder.getName(); @@ -253,7 +256,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { refFrameInvalidationActive = refFrameInvalidationAvc; } - else if (videoFormat == MoonBridge.VIDEO_FORMAT_H265) { + else if ((videoFormat & MoonBridge.VIDEO_FORMAT_MASK_H265) != 0) { mimeType = "video/hevc"; selectedDecoderName = hevcDecoder.getName(); @@ -970,27 +973,24 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { public static class RendererException extends RuntimeException { private static final long serialVersionUID = 8985937536997012406L; - private final Exception originalException; - private final MediaCodecDecoderRenderer renderer; - private ByteBuffer currentBuffer; - private int currentCodecFlags; + private String text; RendererException(MediaCodecDecoderRenderer renderer, Exception e) { - this.renderer = renderer; - this.originalException = e; + this.text = generateText(renderer, e, null, 0); } RendererException(MediaCodecDecoderRenderer renderer, Exception e, ByteBuffer currentBuffer, int currentCodecFlags) { - this.renderer = renderer; - this.originalException = e; - this.currentBuffer = currentBuffer; - this.currentCodecFlags = currentCodecFlags; + this.text = generateText(renderer, e, currentBuffer, currentCodecFlags); } public String toString() { + return text; + } + + private String generateText(MediaCodecDecoderRenderer renderer, Exception originalException, ByteBuffer currentBuffer, int currentCodecFlags) { String str = ""; - str += "Format: "+renderer.videoFormat+"\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"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && renderer.avcDecoder != null) { @@ -1004,8 +1004,9 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { str += "Adaptive playback: "+renderer.adaptivePlayback+"\n"; str += "GL Renderer: "+renderer.glRenderer+"\n"; str += "Build fingerprint: "+Build.FINGERPRINT+"\n"; + str += "Foreground: "+renderer.foreground+"\n"; str += "Consecutive crashes: "+renderer.consecutiveCrashCount+"\n"; - str += "Initial video dimensions: "+renderer.initialWidth+"x"+renderer.initialHeight+"\n"; + str += "Video dimensions: "+renderer.initialWidth+"x"+renderer.initialHeight+"\n"; str += "FPS target: "+renderer.refreshRate+"\n"; str += "Bitrate: "+renderer.prefs.bitrate+" Mbps \n"; str += "In stats: "+renderer.numVpsIn+", "+renderer.numSpsIn+", "+renderer.numPpsIn+"\n"; @@ -1027,6 +1028,20 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { str += "Is Exynos 4: "+renderer.isExynos4+"\n"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (originalException instanceof CodecException) { + CodecException ce = (CodecException) originalException; + + str += "Diagnostic Info: "+ce.getDiagnosticInfo()+"\n"; + str += "Recoverable: "+ce.isRecoverable()+"\n"; + str += "Transient: "+ce.isTransient()+"\n"; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + str += "Codec Error Code: "+ce.getErrorCode()+"\n"; + } + } + } + str += "/proc/cpuinfo:\n"; try { str += MediaCodecHelper.readCpuinfo(); diff --git a/moonlight-common b/moonlight-common index e3d28f93..bb759674 160000 --- a/moonlight-common +++ b/moonlight-common @@ -1 +1 @@ -Subproject commit e3d28f9337da95ff3b820fbe9daae2302b98d4be +Subproject commit bb75967467bb9659302cbee6574467133da955c9