From 3638e8ea1752b3b036f14da0e0f3a54f5144fcba Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Wed, 25 Oct 2023 00:18:05 +0200 Subject: [PATCH] Handle camera disconnection --- .../java/com/genymobile/scrcpy/CameraCapture.java | 11 ++++++++++- .../java/com/genymobile/scrcpy/SurfaceCapture.java | 9 +++++++++ .../java/com/genymobile/scrcpy/SurfaceEncoder.java | 5 +++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java b/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java index 4dcd1bfb..dff2fb48 100644 --- a/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; public class CameraCapture extends SurfaceCapture { @@ -33,6 +34,8 @@ public class CameraCapture extends SurfaceCapture { private CameraDevice cameraDevice; private Executor cameraExecutor; + private final AtomicBoolean disconnected = new AtomicBoolean(); + public CameraCapture(String cameraId, Size explicitSize) { this.cameraId = cameraId; this.explicitSize = explicitSize; @@ -101,7 +104,8 @@ public class CameraCapture extends SurfaceCapture { @Override public void onDisconnected(CameraDevice camera) { Ln.w("Camera disconnected"); - // TODO + disconnected.set(true); + requestReset(); } @Override @@ -186,4 +190,9 @@ public class CameraCapture extends SurfaceCapture { throw (CameraAccessException) e.getCause(); } } + + @Override + public boolean isClosed() { + return disconnected.get(); + } } \ No newline at end of file diff --git a/server/src/main/java/com/genymobile/scrcpy/SurfaceCapture.java b/server/src/main/java/com/genymobile/scrcpy/SurfaceCapture.java index ba4716fb..c5303cb5 100644 --- a/server/src/main/java/com/genymobile/scrcpy/SurfaceCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/SurfaceCapture.java @@ -59,4 +59,13 @@ public abstract class SurfaceCapture { * @param size Maximum size */ public abstract boolean setMaxSize(int size); + + /** + * Indicate if the capture has been closed internally. + * + * @return {@code true} is the capture is closed, {@code false} otherwise. + */ + public boolean isClosed() { + return false; + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/SurfaceEncoder.java b/server/src/main/java/com/genymobile/scrcpy/SurfaceEncoder.java index 9f90115a..28435c09 100644 --- a/server/src/main/java/com/genymobile/scrcpy/SurfaceEncoder.java +++ b/server/src/main/java/com/genymobile/scrcpy/SurfaceEncoder.java @@ -181,6 +181,11 @@ public class SurfaceEncoder implements AsyncProcessor { } } + if (capture.isClosed()) { + // The capture might have been closed internally (for example if the camera is disconnected) + alive = false; + } + return !eof && alive; }