Handle camera disconnection

Stop mirroring on camera disconnection.

PR #4213 <https://github.com/Genymobile/scrcpy/pull/4213>
camera.37
Romain Vimont 7 months ago
parent d544e577c0
commit 64930e71b9

@ -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 explicitCameraId, Size explicitSize) {
this.explicitCameraId = explicitCameraId;
this.explicitSize = explicitSize;
@ -97,7 +100,8 @@ public class CameraCapture extends SurfaceCapture {
@Override
public void onDisconnected(CameraDevice camera) {
Ln.w("Camera disconnected");
// TODO
disconnected.set(true);
requestReset();
}
@Override
@ -177,4 +181,9 @@ public class CameraCapture extends SurfaceCapture {
}
}, cameraHandler);
}
@Override
public boolean isClosed() {
return disconnected.get();
}
}

@ -59,4 +59,13 @@ public abstract class SurfaceCapture {
* @param maxSize Maximum size
*/
public abstract boolean setMaxSize(int maxSize);
/**
* Indicate if the capture has been closed internally.
*
* @return {@code true} is the capture is closed, {@code false} otherwise.
*/
public boolean isClosed() {
return false;
}
}

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

Loading…
Cancel
Save