From ce5a2aa22400c212d3534bb5c2d2beda171a2d25 Mon Sep 17 00:00:00 2001 From: Tommie Date: Sun, 20 Jul 2025 11:50:16 -0400 Subject: [PATCH] Add option to turn on the camera torch Add --camera-torch to turn on the camera torch when the camera starts. TODO ref 6243. Signed-off-by: Romain Vimont --- app/data/bash-completion/scrcpy | 2 ++ app/data/zsh-completion/_scrcpy | 1 + app/scrcpy.1 | 4 ++++ app/src/cli.c | 9 +++++++++ app/src/options.c | 1 + app/src/options.h | 1 + app/src/scrcpy.c | 1 + app/src/server.c | 3 +++ app/src/server.h | 1 + server/src/main/java/com/genymobile/scrcpy/Options.java | 8 ++++++++ .../java/com/genymobile/scrcpy/video/CameraCapture.java | 5 +++++ 11 files changed, 36 insertions(+) diff --git a/app/data/bash-completion/scrcpy b/app/data/bash-completion/scrcpy index a49da8ca..179987b3 100644 --- a/app/data/bash-completion/scrcpy +++ b/app/data/bash-completion/scrcpy @@ -18,6 +18,7 @@ _scrcpy() { --camera-fps= --camera-high-speed --camera-size= + --camera-torch --capture-orientation= --crop= -d --select-usb @@ -197,6 +198,7 @@ _scrcpy() { |--camera-id \ |--camera-fps \ |--camera-size \ + |--camera-torch \ |--crop \ |--display-id \ |--max-fps \ diff --git a/app/data/zsh-completion/_scrcpy b/app/data/zsh-completion/_scrcpy index 04ffb8f1..03ed4c75 100644 --- a/app/data/zsh-completion/_scrcpy +++ b/app/data/zsh-completion/_scrcpy @@ -25,6 +25,7 @@ arguments=( '--camera-facing=[Select the device camera by its facing direction]:facing:(front back external)' '--camera-fps=[Specify the camera capture frame rate]' '--camera-size=[Specify an explicit camera capture size]' + '--camera-torch[Turn on the camera torch when the camera starts]' '--capture-orientation=[Set the capture video orientation]:orientation:(0 90 180 270 flip0 flip90 flip180 flip270 @0 @90 @180 @270 @flip0 @flip90 @flip180 @flip270)' '--crop=[\[width\:height\:x\:y\] Crop the device screen on the server]' {-d,--select-usb}'[Use USB device]' diff --git a/app/scrcpy.1 b/app/scrcpy.1 index d72fda13..092eba36 100644 --- a/app/scrcpy.1 +++ b/app/scrcpy.1 @@ -131,6 +131,10 @@ The available camera ids can be listed by \fB\-\-list\-cameras\fR. .BI "\-\-camera\-size " width\fRx\fIheight Specify an explicit camera capture size. +.TP +.BI \-\-camera\-torch +Turn on the camera torch when the camera starts. + .TP .BI "\-\-capture\-orientation " value Possible values are 0, 90, 180, 270, flip0, flip90, flip180 and flip270, possibly prefixed by '@'. diff --git a/app/src/cli.c b/app/src/cli.c index 06592aa0..c79bb074 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -114,6 +114,7 @@ enum { OPT_NO_VD_SYSTEM_DECORATIONS, OPT_NO_VD_DESTROY_CONTENT, OPT_DISPLAY_IME_POLICY, + OPT_CAMERA_TORCH, }; struct sc_option { @@ -313,6 +314,11 @@ static const struct sc_option options[] = { .argdesc = "x", .text = "Specify an explicit camera capture size.", }, + { + .longopt_id = OPT_CAMERA_TORCH, + .longopt = "camera-torch", + .text = "Turn on the camera torch when the camera starts.", + }, { .longopt_id = OPT_CAPTURE_ORIENTATION, .longopt = "capture-orientation", @@ -2780,6 +2786,9 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[], case OPT_CAMERA_HIGH_SPEED: opts->camera_high_speed = true; break; + case OPT_CAMERA_TORCH: + opts->camera_torch = true; + break; case OPT_NO_WINDOW: opts->window = false; break; diff --git a/app/src/options.c b/app/src/options.c index 0fe82d29..2d187564 100644 --- a/app/src/options.c +++ b/app/src/options.c @@ -113,6 +113,7 @@ const struct scrcpy_options scrcpy_options_default = { .angle = NULL, .vd_destroy_content = true, .vd_system_decorations = true, + .camera_torch = false, }; enum sc_orientation diff --git a/app/src/options.h b/app/src/options.h index 03b42913..1770ee5e 100644 --- a/app/src/options.h +++ b/app/src/options.h @@ -327,6 +327,7 @@ struct scrcpy_options { const char *start_app; bool vd_destroy_content; bool vd_system_decorations; + bool camera_torch; }; extern const struct scrcpy_options scrcpy_options_default; diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index 01730ce7..db2b6732 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -469,6 +469,7 @@ scrcpy(struct scrcpy_options *options) { .power_on = options->power_on, .kill_adb_on_close = options->kill_adb_on_close, .camera_high_speed = options->camera_high_speed, + .camera_torch = options->camera_torch, .vd_destroy_content = options->vd_destroy_content, .vd_system_decorations = options->vd_system_decorations, .list = options->list, diff --git a/app/src/server.c b/app/src/server.c index 153219c3..954c59e2 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -357,6 +357,9 @@ execute_server(struct sc_server *server, if (params->camera_high_speed) { ADD_PARAM("camera_high_speed=true"); } + if (params->camera_torch) { + ADD_PARAM("camera_torch=true"); + } if (params->show_touches) { ADD_PARAM("show_touches=true"); } diff --git a/app/src/server.h b/app/src/server.h index 5f4592de..2aeb135d 100644 --- a/app/src/server.h +++ b/app/src/server.h @@ -68,6 +68,7 @@ struct sc_server_params { bool power_on; bool kill_adb_on_close; bool camera_high_speed; + bool camera_torch; bool vd_destroy_content; bool vd_system_decorations; uint8_t list; diff --git a/server/src/main/java/com/genymobile/scrcpy/Options.java b/server/src/main/java/com/genymobile/scrcpy/Options.java index 89508942..183fd748 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Options.java +++ b/server/src/main/java/com/genymobile/scrcpy/Options.java @@ -46,6 +46,7 @@ public class Options { private CameraAspectRatio cameraAspectRatio; private int cameraFps; private boolean cameraHighSpeed; + private boolean cameraTorch; private boolean showTouches; private boolean stayAwake; private int screenOffTimeout = -1; @@ -176,6 +177,10 @@ public class Options { return cameraHighSpeed; } + public boolean getCameraTorch() { + return cameraTorch; + } + public boolean getShowTouches() { return showTouches; } @@ -474,6 +479,9 @@ public class Options { case "camera_high_speed": options.cameraHighSpeed = Boolean.parseBoolean(value); break; + case "camera_torch": + options.cameraTorch = Boolean.parseBoolean(value); + break; case "new_display": options.newDisplay = parseNewDisplay(value); break; diff --git a/server/src/main/java/com/genymobile/scrcpy/video/CameraCapture.java b/server/src/main/java/com/genymobile/scrcpy/video/CameraCapture.java index ad0348ab..bf534cac 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/CameraCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/CameraCapture.java @@ -64,6 +64,7 @@ public class CameraCapture extends SurfaceCapture { private final Rect crop; private final Orientation captureOrientation; private final float angle; + private final boolean initialTorch; private String cameraId; private Size captureSize; @@ -94,6 +95,7 @@ public class CameraCapture extends SurfaceCapture { this.captureOrientation = options.getCaptureOrientation(); assert captureOrientation != null; this.angle = options.getAngle(); + this.initialTorch = options.getCameraTorch(); } @Override @@ -291,6 +293,9 @@ public class CameraCapture extends SurfaceCapture { if (fps > 0) { requestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<>(fps, fps)); } + if (initialTorch) { + requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); + } CaptureRequest request = requestBuilder.build(); setRepeatingRequest(session, request);