From 178c53ee8497f536882f92b61624a5018441bc06 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 3 Sep 2014 20:00:00 -0700 Subject: [PATCH] Propagate the possible exceptions during codec capability checks to the caller so a nice dialog can be displayed instead of crashing on buggy ROMs. Small change to evdev shutdown. --- src/com/limelight/Game.java | 13 +++++++++++-- .../binding/video/ConfigurableDecoderRenderer.java | 2 +- .../binding/video/MediaCodecDecoderRenderer.java | 5 ++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/com/limelight/Game.java b/src/com/limelight/Game.java index b661edf8..9cd58ea1 100644 --- a/src/com/limelight/Game.java +++ b/src/com/limelight/Game.java @@ -198,7 +198,16 @@ public class Game extends Activity implements SurfaceHolder.Callback, controllerHandler = new ControllerHandler(conn); decoderRenderer = new ConfigurableDecoderRenderer(); - decoderRenderer.initializeWithFlags(drFlags); + + try { + decoderRenderer.initializeWithFlags(drFlags); + } catch (Exception e) { + Dialog.displayDialog(this, "Hardware Decoder Failure", + "The hardware decoder failed to initialize. First, try restarting your device."+ + "If the issue persists, please send an email to the app developer. Forcing software decoding" + + "can circumvent this error if needed.", true); + return; + } SurfaceHolder sh = sv.getHolder(); if (stretchToFit || !decoderRenderer.isHardwareAccelerated()) { @@ -301,7 +310,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } - if (LimelightBuildProps.ROOT_BUILD) { + if (evdevWatcher != null) { evdevWatcher.shutdown(); } diff --git a/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java b/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java index edc31636..1ee9843b 100644 --- a/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java +++ b/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java @@ -22,7 +22,7 @@ public class ConfigurableDecoderRenderer implements VideoDecoderRenderer { return decoderRenderer.setup(width, height, redrawRate, renderTarget, drFlags); } - public void initializeWithFlags(int drFlags) { + public void initializeWithFlags(int drFlags) throws Exception { if ((drFlags & VideoDecoderRenderer.FLAG_FORCE_HARDWARE_DECODING) != 0 || ((drFlags & VideoDecoderRenderer.FLAG_FORCE_SOFTWARE_DECODING) == 0 && MediaCodecDecoderRenderer.findSafeDecoder() != null)) { diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 2a813aaa..186572cb 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -91,7 +91,10 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } } - public static MediaCodecInfo findSafeDecoder() { + // We declare this method as explicitly throwing Exception + // since some bad decoders can throw IllegalArgumentExceptions unexpectedly + // and we want to be sure all callers are handling this possibility + public static MediaCodecInfo findSafeDecoder() throws Exception { for (int i = 0; i < MediaCodecList.getCodecCount(); i++) { MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);