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; }