From 94a26fb83166b4cd7fc1a7ec3c4af6195569a03c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 26 Sep 2014 20:50:34 -0700 Subject: [PATCH 1/7] Force CPU decoding to low performance to make the experience less horrible --- src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java index 7521ad0c..76db5fb7 100644 --- a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java +++ b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java @@ -93,7 +93,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { public boolean setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { this.targetFps = redrawRate; - int perfLevel = findOptimalPerformanceLevel(); + int perfLevel = LOW_PERF; //findOptimalPerformanceLevel(); int threadCount; int avcFlags = 0; From a3106bffca1ce1e0e53458c476e098d10a6f7b13 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Sep 2014 15:42:12 -0700 Subject: [PATCH 2/7] Speed up initial discovery by generating a new keypair while discovering machines. --- src/com/limelight/PcView.java | 4 ++++ .../limelight/binding/crypto/AndroidCryptoProvider.java | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/com/limelight/PcView.java b/src/com/limelight/PcView.java index ae22092a..04dbf8ab 100644 --- a/src/com/limelight/PcView.java +++ b/src/com/limelight/PcView.java @@ -6,6 +6,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import com.limelight.binding.PlatformBinding; +import com.limelight.binding.crypto.AndroidCryptoProvider; import com.limelight.computers.ComputerManagerListener; import com.limelight.computers.ComputerManagerService; import com.limelight.nvstream.http.ComputerDetails; @@ -59,6 +60,9 @@ public class PcView extends Activity { // Start updates startComputerUpdates(); + + // Force a keypair to be generated early to avoid discovery delays + new AndroidCryptoProvider(PcView.this).getClientCertificate(); } }.start(); } diff --git a/src/com/limelight/binding/crypto/AndroidCryptoProvider.java b/src/com/limelight/binding/crypto/AndroidCryptoProvider.java index 4df63dca..242749f3 100644 --- a/src/com/limelight/binding/crypto/AndroidCryptoProvider.java +++ b/src/com/limelight/binding/crypto/AndroidCryptoProvider.java @@ -51,6 +51,8 @@ public class AndroidCryptoProvider implements LimelightCryptoProvider { private RSAPrivateKey key; private byte[] pemCertBytes; + private static Object globalCryptoLock = new Object(); + static { // Install the Bouncy Castle provider Security.addProvider(new BouncyCastleProvider()); @@ -208,7 +210,7 @@ public class AndroidCryptoProvider implements LimelightCryptoProvider { public X509Certificate getClientCertificate() { // Use a lock here to ensure only one guy will be generating or loading // the certificate and key at a time - synchronized (this) { + synchronized (globalCryptoLock) { // Return a loaded cert if we have one if (cert != null) { return cert; @@ -235,7 +237,7 @@ public class AndroidCryptoProvider implements LimelightCryptoProvider { public RSAPrivateKey getClientPrivateKey() { // Use a lock here to ensure only one guy will be generating or loading // the certificate and key at a time - synchronized (this) { + synchronized (globalCryptoLock) { // Return a loaded key if we have one if (key != null) { return key; @@ -260,7 +262,7 @@ public class AndroidCryptoProvider implements LimelightCryptoProvider { } public byte[] getPemEncodedClientCertificate() { - synchronized (this) { + synchronized (globalCryptoLock) { // Call our helper function to do the cert loading/generation for us getClientCertificate(); From 36664133f8b3b7b823a41e6fa9e955f3dc5cd43c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Sep 2014 15:43:43 -0700 Subject: [PATCH 3/7] Speed up PC polling by only trying once if the remote and local IPs are the same --- src/com/limelight/computers/ComputerManagerService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/com/limelight/computers/ComputerManagerService.java b/src/com/limelight/computers/ComputerManagerService.java index c82596c0..009cc143 100644 --- a/src/com/limelight/computers/ComputerManagerService.java +++ b/src/com/limelight/computers/ComputerManagerService.java @@ -342,7 +342,7 @@ public class ComputerManagerService extends Service { polledDetails = tryPollIp(details.remoteIp); } - if (polledDetails == null) { + if (polledDetails == null && !details.localIp.equals(details.remoteIp)) { // Failed, so let's try the fallback if (!localFirst) { polledDetails = tryPollIp(details.localIp); @@ -356,7 +356,8 @@ public class ComputerManagerService extends Service { polledDetails.reachability = !localFirst ? ComputerDetails.Reachability.LOCAL : ComputerDetails.Reachability.REMOTE; } - } else { + } + else if (polledDetails != null) { polledDetails.reachability = localFirst ? ComputerDetails.Reachability.LOCAL : ComputerDetails.Reachability.REMOTE; } From 31b0bcf0414b69d15cfb5b97757337f6d126a56d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Sep 2014 15:45:37 -0700 Subject: [PATCH 4/7] Fix manually adding PCs --- src/com/limelight/computers/ComputerManagerService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/limelight/computers/ComputerManagerService.java b/src/com/limelight/computers/ComputerManagerService.java index 009cc143..456d32df 100644 --- a/src/com/limelight/computers/ComputerManagerService.java +++ b/src/com/limelight/computers/ComputerManagerService.java @@ -402,7 +402,12 @@ public class ComputerManagerService extends Service { public void run() { boolean newPc = (details.name == null); - if (stopped) { + // This is called from addComputerManually() where we don't + // want to block the initial poll if polling is disabled, so + // we explicitly let this through if we've never seen this + // PC before. This path won't be triggered normally when polling + // is disabled because the mDNS discovery is stopped. + if (stopped && !newPc) { return; } From 080dcd92d706873d834a8ec8a0c3bb605c2ccf83 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Sep 2014 15:45:54 -0700 Subject: [PATCH 5/7] Suppress a warning --- src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java index 76db5fb7..498bb114 100644 --- a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java +++ b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java @@ -38,6 +38,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { private int cpuCount = Runtime.getRuntime().availableProcessors(); + @SuppressWarnings("unused") private int findOptimalPerformanceLevel() { StringBuilder cpuInfo = new StringBuilder(); BufferedReader br = null; From 6677949614fadfe3f15ef3891698faca1ff5a237 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Sep 2014 15:49:59 -0700 Subject: [PATCH 6/7] Update common jar --- libs/limelight-common.jar | Bin 418249 -> 418126 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/libs/limelight-common.jar b/libs/limelight-common.jar index dafe56adc217d136f53d51e3992a499f887b7549..78eb0bd489e45d4b0885c2a9b5f9f06f257aaa52 100644 GIT binary patch delta 30620 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 AJ^%m! delta 30524 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 Date: Sat, 27 Sep 2014 19:32:10 -0700 Subject: [PATCH 7/7] Use a common cleanup function and stop input capturing after closing the connection to allow captured devices to accept the "Connection Failed" dialog --- src/com/limelight/Game.java | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/com/limelight/Game.java b/src/com/limelight/Game.java index 61b30507..4ba30d7a 100644 --- a/src/com/limelight/Game.java +++ b/src/com/limelight/Game.java @@ -286,7 +286,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, Dialog.closeDialogs(); displayedFailureDialog = true; - conn.stop(); + stopConnection(); int averageEndToEndLat = decoderRenderer.getAverageEndToEndLatency(); int averageDecoderLat = decoderRenderer.getAverageDecoderLatency(); @@ -304,10 +304,6 @@ public class Game extends Activity implements SurfaceHolder.Callback, if (message != null) { Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } - - if (evdevWatcher != null) { - evdevWatcher.shutdown(); - } finish(); } @@ -572,6 +568,19 @@ public class Game extends Activity implements SurfaceHolder.Callback, @Override public void stageComplete(Stage stage) { } + + private void stopConnection() { + if (connecting || connected) { + conn.stop(); + connecting = connected = false; + } + + // Close the Evdev watcher to allow use of captured input devices + if (evdevWatcher != null) { + evdevWatcher.shutdown(); + evdevWatcher = null; + } + } @Override public void stageFailed(Stage stage) { @@ -583,8 +592,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, if (!displayedFailureDialog) { displayedFailureDialog = true; Dialog.displayDialog(this, "Connection Error", "Starting "+stage.getName()+" failed", true); - conn.stop(); - connecting = false; + stopConnection(); } } @@ -593,9 +601,9 @@ public class Game extends Activity implements SurfaceHolder.Callback, if (!displayedFailureDialog) { displayedFailureDialog = true; e.printStackTrace(); + Dialog.displayDialog(this, "Connection Terminated", "The connection failed unexpectedly", true); - conn.stop(); - connected = false; + stopConnection(); } } @@ -657,8 +665,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, @Override public void surfaceDestroyed(SurfaceHolder holder) { if (connected) { - conn.stop(); - connected = false; + stopConnection(); } }