Add --camera-facing
Add an option to select the camera by its lens facing (any, front, back or external). Co-authored-by: Romain Vimont <rom@rom1v.com> Signed-off-by: Romain Vimont <rom@rom1v.com>
This commit is contained in:
committed by
Romain Vimont
parent
88edb20e53
commit
9b38f63ab1
@@ -6,6 +6,7 @@ import android.annotation.SuppressLint;
|
||||
import android.annotation.TargetApi;
|
||||
import android.hardware.camera2.CameraAccessException;
|
||||
import android.hardware.camera2.CameraCaptureSession;
|
||||
import android.hardware.camera2.CameraCharacteristics;
|
||||
import android.hardware.camera2.CameraDevice;
|
||||
import android.hardware.camera2.CameraManager;
|
||||
import android.hardware.camera2.CaptureFailure;
|
||||
@@ -27,7 +28,25 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class CameraCapture extends SurfaceCapture {
|
||||
|
||||
private final String explicitCameraId;
|
||||
public static class CameraSelection {
|
||||
private String explicitCameraId;
|
||||
private CameraFacing cameraFacing;
|
||||
|
||||
public CameraSelection(String explicitCameraId, CameraFacing cameraFacing) {
|
||||
this.explicitCameraId = explicitCameraId;
|
||||
this.cameraFacing = cameraFacing;
|
||||
}
|
||||
|
||||
boolean hasId() {
|
||||
return explicitCameraId != null;
|
||||
}
|
||||
|
||||
boolean hasProperties() {
|
||||
return cameraFacing != null;
|
||||
}
|
||||
}
|
||||
|
||||
private final CameraSelection cameraSelection;
|
||||
private final Size explicitSize;
|
||||
|
||||
private HandlerThread cameraThread;
|
||||
@@ -37,8 +56,8 @@ public class CameraCapture extends SurfaceCapture {
|
||||
|
||||
private final AtomicBoolean disconnected = new AtomicBoolean();
|
||||
|
||||
public CameraCapture(String explicitCameraId, Size explicitSize) {
|
||||
this.explicitCameraId = explicitCameraId;
|
||||
public CameraCapture(CameraSelection cameraSelection, Size explicitSize) {
|
||||
this.cameraSelection = cameraSelection;
|
||||
this.explicitSize = explicitSize;
|
||||
}
|
||||
|
||||
@@ -50,7 +69,7 @@ public class CameraCapture extends SurfaceCapture {
|
||||
cameraExecutor = new HandlerExecutor(cameraHandler);
|
||||
|
||||
try {
|
||||
String cameraId = selectCamera(explicitCameraId);
|
||||
String cameraId = selectCamera(cameraSelection);
|
||||
if (cameraId == null) {
|
||||
throw new IOException("No matching camera found");
|
||||
}
|
||||
@@ -62,16 +81,35 @@ public class CameraCapture extends SurfaceCapture {
|
||||
}
|
||||
}
|
||||
|
||||
private String selectCamera(String explicitCameraId) throws CameraAccessException {
|
||||
if (explicitCameraId != null) {
|
||||
return explicitCameraId;
|
||||
private String selectCamera(CameraSelection cameraSelection) throws CameraAccessException {
|
||||
if (cameraSelection.hasId()) {
|
||||
return cameraSelection.explicitCameraId;
|
||||
}
|
||||
|
||||
CameraManager cameraManager = ServiceManager.getCameraManager();
|
||||
|
||||
String[] cameraIds = cameraManager.getCameraIdList();
|
||||
// Use the first one
|
||||
return cameraIds.length > 0 ? cameraIds[0] : null;
|
||||
if (!cameraSelection.hasProperties()) {
|
||||
// Use the first one
|
||||
return cameraIds.length > 0 ? cameraIds[0] : null;
|
||||
}
|
||||
|
||||
for (String cameraId : cameraIds) {
|
||||
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
|
||||
|
||||
if (cameraSelection.cameraFacing != null) {
|
||||
int facing = characteristics.get(CameraCharacteristics.LENS_FACING);
|
||||
if (cameraSelection.cameraFacing.value() != facing) {
|
||||
// Does not match
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return cameraId;
|
||||
}
|
||||
|
||||
// Not found
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
31
server/src/main/java/com/genymobile/scrcpy/CameraFacing.java
Normal file
31
server/src/main/java/com/genymobile/scrcpy/CameraFacing.java
Normal file
@@ -0,0 +1,31 @@
|
||||
package com.genymobile.scrcpy;
|
||||
|
||||
import android.hardware.camera2.CameraCharacteristics;
|
||||
|
||||
public enum CameraFacing {
|
||||
FRONT("front", CameraCharacteristics.LENS_FACING_FRONT),
|
||||
BACK("back", CameraCharacteristics.LENS_FACING_BACK),
|
||||
EXTERNAL("external", CameraCharacteristics.LENS_FACING_EXTERNAL);
|
||||
|
||||
private final String name;
|
||||
private final int value;
|
||||
|
||||
CameraFacing(String name, int value) {
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
int value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
static CameraFacing findByName(String name) {
|
||||
for (CameraFacing facing : CameraFacing.values()) {
|
||||
if (name.equals(facing.name)) {
|
||||
return facing;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ public class Options {
|
||||
private int displayId;
|
||||
private String cameraId;
|
||||
private Size cameraSize;
|
||||
private CameraFacing cameraFacing;
|
||||
private boolean showTouches;
|
||||
private boolean stayAwake;
|
||||
private List<CodecOption> videoCodecOptions;
|
||||
@@ -126,6 +127,10 @@ public class Options {
|
||||
return cameraSize;
|
||||
}
|
||||
|
||||
public CameraFacing getCameraFacing() {
|
||||
return cameraFacing;
|
||||
}
|
||||
|
||||
public boolean getShowTouches() {
|
||||
return showTouches;
|
||||
}
|
||||
@@ -360,6 +365,15 @@ public class Options {
|
||||
options.cameraSize = parseSize(value);
|
||||
}
|
||||
break;
|
||||
case "camera_facing":
|
||||
if (!value.isEmpty()) {
|
||||
CameraFacing facing = CameraFacing.findByName(value);
|
||||
if (facing == null) {
|
||||
throw new IllegalArgumentException("Camera facing " + value + " not supported");
|
||||
}
|
||||
options.cameraFacing = facing;
|
||||
}
|
||||
break;
|
||||
case "send_device_meta":
|
||||
options.sendDeviceMeta = Boolean.parseBoolean(value);
|
||||
break;
|
||||
|
||||
@@ -138,7 +138,9 @@ public final class Server {
|
||||
if (options.getVideoSource() == VideoSource.DISPLAY) {
|
||||
surfaceCapture = new ScreenCapture(device);
|
||||
} else {
|
||||
surfaceCapture = new CameraCapture(options.getCameraId(), options.getCameraSize());
|
||||
CameraCapture.CameraSelection cameraSelection = new CameraCapture.CameraSelection(options.getCameraId(),
|
||||
options.getCameraFacing());
|
||||
surfaceCapture = new CameraCapture(cameraSelection, options.getCameraSize());
|
||||
}
|
||||
SurfaceEncoder surfaceEncoder = new SurfaceEncoder(surfaceCapture, videoStreamer, options.getVideoBitRate(), options.getMaxFps(),
|
||||
options.getVideoCodecOptions(), options.getVideoEncoder(), options.getDownsizeOnError());
|
||||
|
||||
Reference in New Issue
Block a user