diff --git a/app/src/server.c b/app/src/server.c index 343b947d..7cbe9c7e 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -265,17 +265,18 @@ execute_server(struct server *server, const struct server_params *params) { #define STRBOOL(p) (p ? "true" : "false") - ADD_PARAM("%"PRIu16, params->max_size); - ADD_PARAM("%"PRIu32, params->bit_rate); - ADD_PARAM("%"PRIu16, params->max_fps); - ADD_PARAM("%"PRIi8, params->lock_video_orientation); - ADD_PARAM("%s", STRBOOL(server->tunnel_forward)); - ADD_PARAM("%s", params->crop ? params->crop : "-"); - ADD_PARAM("true"); // always send frame meta (packet boundaries + timestamp) - ADD_PARAM("%s", STRBOOL(params->control)); - ADD_PARAM("%"PRIu16, params->display_id); - ADD_PARAM("%s", STRBOOL(params->show_touches)); - ADD_PARAM("%s", STRBOOL(params->stay_awake)); + ADD_PARAM("max_size=%"PRIu16, params->max_size); + ADD_PARAM("bit_rate=%"PRIu32, params->bit_rate); + ADD_PARAM("max_fps=%"PRIu16, params->max_fps); + ADD_PARAM("lock_video_orientation=%"PRIi8, params->lock_video_orientation); + ADD_PARAM("tunnel_forward=%s", STRBOOL(server->tunnel_forward)); + ADD_PARAM("crop=%s", params->crop ? params->crop : ""); + // always send frame meta (packet boundaries + timestamp) + ADD_PARAM("send_frame_meta=true"); + ADD_PARAM("control=%s", STRBOOL(params->control)); + ADD_PARAM("display_id=%"PRIu16, params->display_id); + ADD_PARAM("show_touches=%s", STRBOOL(params->show_touches)); + ADD_PARAM("stay_awake=%s", STRBOOL(params->stay_awake)); #undef ADD_PARAM #undef STRBOOL diff --git a/server/src/main/java/com/genymobile/scrcpy/Options.java b/server/src/main/java/com/genymobile/scrcpy/Options.java index 152aa2f7..ea8d8071 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Options.java +++ b/server/src/main/java/com/genymobile/scrcpy/Options.java @@ -6,7 +6,7 @@ public class Options { private int maxSize; private int bitRate; private int maxFps; - private int lockedVideoOrientation; + private int lockedVideoOrientation = -1; private boolean tunnelForward; private Rect crop; private boolean sendFrameMeta; // send PTS so that the client may record properly diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index 73776c3e..9e215131 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -109,52 +109,73 @@ public final class Server { "The server version (" + BuildConfig.VERSION_NAME + ") does not match the client " + "(" + clientVersion + ")"); } - final int expectedParameters = 12; - if (args.length != expectedParameters) { - throw new IllegalArgumentException("Expecting " + expectedParameters + " parameters"); - } - Options options = new Options(); - int maxSize = Integer.parseInt(args[1]) & ~7; // multiple of 8 - options.setMaxSize(maxSize); + for (int i = 1; i < args.length; ++i) { + String arg = args[i]; + int equalIndex = arg.indexOf('='); + if (equalIndex == -1) { + throw new IllegalArgumentException("Invalid key=value pair: \"" + arg + "\""); + } + String key = arg.substring(0, equalIndex); + String value = arg.substring(equalIndex + 1); - int bitRate = Integer.parseInt(args[2]); - options.setBitRate(bitRate); - - int maxFps = Integer.parseInt(args[3]); - options.setMaxFps(maxFps); - - int lockedVideoOrientation = Integer.parseInt(args[4]); - options.setLockedVideoOrientation(lockedVideoOrientation); - - // use "adb forward" instead of "adb tunnel"? (so the server must listen) - boolean tunnelForward = Boolean.parseBoolean(args[5]); - options.setTunnelForward(tunnelForward); - - Rect crop = parseCrop(args[6]); - options.setCrop(crop); - - boolean sendFrameMeta = Boolean.parseBoolean(args[7]); - options.setSendFrameMeta(sendFrameMeta); - - boolean control = Boolean.parseBoolean(args[8]); - options.setControl(control); - - int displayId = Integer.parseInt(args[9]); - options.setDisplayId(displayId); - - boolean showTouches = Boolean.parseBoolean(args[10]); - options.setShowTouches(showTouches); - - boolean stayAwake = Boolean.parseBoolean(args[11]); - options.setStayAwake(stayAwake); + switch (key) { + case "max_size": + int maxSize = Integer.parseInt(value) & ~7; // multiple of 8 + options.setMaxSize(maxSize); + break; + case "bit_rate": + int bitRate = Integer.parseInt(value); + options.setBitRate(bitRate); + break; + case "max_fps": + int maxFps = Integer.parseInt(value); + options.setMaxFps(maxFps); + break; + case "lock_video_orientation": + int lockedVideoOrientation = Integer.parseInt(value); + options.setLockedVideoOrientation(lockedVideoOrientation); + break; + case "tunnel_forward": + // use "adb forward" instead of "adb tunnel"? (so the server must listen) + boolean tunnelForward = Boolean.parseBoolean(value); + options.setTunnelForward(tunnelForward); + break; + case "crop": + Rect crop = parseCrop(value); + options.setCrop(crop); + break; + case "send_frame_meta": + boolean sendFrameMeta = Boolean.parseBoolean(value); + options.setSendFrameMeta(sendFrameMeta); + break; + case "control": + boolean control = Boolean.parseBoolean(value); + options.setControl(control); + break; + case "display_id": + int displayId = Integer.parseInt(value); + options.setDisplayId(displayId); + break; + case "show_touches": + boolean showTouches = Boolean.parseBoolean(value); + options.setShowTouches(showTouches); + break; + case "stay_awake": + boolean stayAwake = Boolean.parseBoolean(value); + options.setStayAwake(stayAwake); + break; + default: + throw new IllegalArgumentException("Unknown parameter: " + key); + } + } return options; } private static Rect parseCrop(String crop) { - if ("-".equals(crop)) { + if (crop.isEmpty()) { return null; } // input format: "width:height:x:y"