Rename --bit-rate to --video-bit-rate
This prepares the introduction of --audio-bit-rate. PR #3757 <https://github.com/Genymobile/scrcpy/pull/3757>
This commit is contained in:
parent
cee40ca047
commit
9087e85c3f
14 changed files with 39 additions and 29 deletions
|
@ -199,7 +199,7 @@ preserved. That way, a device in 1920×1080 will be mirrored at 1024×576.
|
||||||
The default bit-rate is 8 Mbps. To change the video bitrate (e.g. to 2 Mbps):
|
The default bit-rate is 8 Mbps. To change the video bitrate (e.g. to 2 Mbps):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
scrcpy --bit-rate=2M
|
scrcpy --video-bit-rate=2M
|
||||||
scrcpy -b 2M # short version
|
scrcpy -b 2M # short version
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -444,7 +444,7 @@ none found, try running `adb disconnect`, and then run those two commands again.
|
||||||
It may be useful to decrease the bit-rate and the resolution:
|
It may be useful to decrease the bit-rate and the resolution:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
scrcpy --bit-rate=2M --max-size=800
|
scrcpy --video-bit-rate=2M --max-size=800
|
||||||
scrcpy -b2M -m800 # short version
|
scrcpy -b2M -m800 # short version
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ _scrcpy() {
|
||||||
local cur prev words cword
|
local cur prev words cword
|
||||||
local opts="
|
local opts="
|
||||||
--always-on-top
|
--always-on-top
|
||||||
-b --bit-rate=
|
-b --video-bit-rate=
|
||||||
--codec-options=
|
--codec-options=
|
||||||
--crop=
|
--crop=
|
||||||
-d --select-usb
|
-d --select-usb
|
||||||
|
@ -104,7 +104,7 @@ _scrcpy() {
|
||||||
COMPREPLY=($(compgen -W "$("${ADB:-adb}" devices | awk '$2 == "device" {print $1}')" -- ${cur}))
|
COMPREPLY=($(compgen -W "$("${ADB:-adb}" devices | awk '$2 == "device" {print $1}')" -- ${cur}))
|
||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
-b|--bit-rate \
|
-b|--video-bit-rate \
|
||||||
|--codec-options \
|
|--codec-options \
|
||||||
|--crop \
|
|--crop \
|
||||||
|--display \
|
|--display \
|
||||||
|
|
|
@ -9,7 +9,7 @@ local arguments
|
||||||
|
|
||||||
arguments=(
|
arguments=(
|
||||||
'--always-on-top[Make scrcpy window always on top \(above other windows\)]'
|
'--always-on-top[Make scrcpy window always on top \(above other windows\)]'
|
||||||
{-b,--bit-rate=}'[Encode the video at the given bit-rate]'
|
{-b,--video-bit-rate=}'[Encode the video at the given bit-rate]'
|
||||||
'--codec-options=[Set a list of comma-separated key\:type=value options for the device encoder]'
|
'--codec-options=[Set a list of comma-separated key\:type=value options for the device encoder]'
|
||||||
'--crop=[\[width\:height\:x\:y\] Crop the device screen on the server]'
|
'--crop=[\[width\:height\:x\:y\] Crop the device screen on the server]'
|
||||||
{-d,--select-usb}'[Use USB device]'
|
{-d,--select-usb}'[Use USB device]'
|
||||||
|
|
|
@ -20,7 +20,7 @@ provides display and control of Android devices connected on USB (or over TCP/IP
|
||||||
Make scrcpy window always on top (above other windows).
|
Make scrcpy window always on top (above other windows).
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BI "\-b, \-\-bit\-rate " value
|
.BI "\-b, \-\-video\-bit\-rate " value
|
||||||
Encode the video at the given bit\-rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000).
|
Encode the video at the given bit\-rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000).
|
||||||
|
|
||||||
Default is 8M (8000000).
|
Default is 8M (8000000).
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
OPT_RENDER_EXPIRED_FRAMES = 1000,
|
OPT_RENDER_EXPIRED_FRAMES = 1000,
|
||||||
|
OPT_BIT_RATE,
|
||||||
OPT_WINDOW_TITLE,
|
OPT_WINDOW_TITLE,
|
||||||
OPT_PUSH_TARGET,
|
OPT_PUSH_TARGET,
|
||||||
OPT_ALWAYS_ON_TOP,
|
OPT_ALWAYS_ON_TOP,
|
||||||
|
@ -104,12 +105,18 @@ static const struct sc_option options[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.shortopt = 'b',
|
.shortopt = 'b',
|
||||||
.longopt = "bit-rate",
|
.longopt = "video-bit-rate",
|
||||||
.argdesc = "value",
|
.argdesc = "value",
|
||||||
.text = "Encode the video at the given bit-rate, expressed in bits/s. "
|
.text = "Encode the video at the given bit-rate, expressed in bits/s. "
|
||||||
"Unit suffixes are supported: 'K' (x1000) and 'M' (x1000000).\n"
|
"Unit suffixes are supported: 'K' (x1000) and 'M' (x1000000).\n"
|
||||||
"Default is 8M (8000000).",
|
"Default is 8M (8000000).",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// deprecated
|
||||||
|
.longopt_id = OPT_BIT_RATE,
|
||||||
|
.longopt = "bit-rate",
|
||||||
|
.argdesc = "value",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// Not really deprecated (--codec has never been released), but without
|
// Not really deprecated (--codec has never been released), but without
|
||||||
// declaring an explicit --codec option, getopt_long() partial matching
|
// declaring an explicit --codec option, getopt_long() partial matching
|
||||||
|
@ -1432,8 +1439,11 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[],
|
||||||
int c;
|
int c;
|
||||||
while ((c = getopt_long(argc, argv, optstring, longopts, NULL)) != -1) {
|
while ((c = getopt_long(argc, argv, optstring, longopts, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
case OPT_BIT_RATE:
|
||||||
|
LOGW("--bit-rate is deprecated, use --video-bit-rate instead.");
|
||||||
|
// fall through
|
||||||
case 'b':
|
case 'b':
|
||||||
if (!parse_bit_rate(optarg, &opts->bit_rate)) {
|
if (!parse_bit_rate(optarg, &opts->video_bit_rate)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -28,7 +28,7 @@ const struct scrcpy_options scrcpy_options_default = {
|
||||||
.count = 2,
|
.count = 2,
|
||||||
},
|
},
|
||||||
.max_size = 0,
|
.max_size = 0,
|
||||||
.bit_rate = 0,
|
.video_bit_rate = 0,
|
||||||
.max_fps = 0,
|
.max_fps = 0,
|
||||||
.lock_video_orientation = SC_LOCK_VIDEO_ORIENTATION_UNLOCKED,
|
.lock_video_orientation = SC_LOCK_VIDEO_ORIENTATION_UNLOCKED,
|
||||||
.rotation = 0,
|
.rotation = 0,
|
||||||
|
|
|
@ -108,7 +108,7 @@ struct scrcpy_options {
|
||||||
uint16_t tunnel_port;
|
uint16_t tunnel_port;
|
||||||
struct sc_shortcut_mods shortcut_mods;
|
struct sc_shortcut_mods shortcut_mods;
|
||||||
uint16_t max_size;
|
uint16_t max_size;
|
||||||
uint32_t bit_rate;
|
uint32_t video_bit_rate;
|
||||||
uint16_t max_fps;
|
uint16_t max_fps;
|
||||||
enum sc_lock_video_orientation lock_video_orientation;
|
enum sc_lock_video_orientation lock_video_orientation;
|
||||||
uint8_t rotation;
|
uint8_t rotation;
|
||||||
|
|
|
@ -320,7 +320,7 @@ scrcpy(struct scrcpy_options *options) {
|
||||||
.tunnel_host = options->tunnel_host,
|
.tunnel_host = options->tunnel_host,
|
||||||
.tunnel_port = options->tunnel_port,
|
.tunnel_port = options->tunnel_port,
|
||||||
.max_size = options->max_size,
|
.max_size = options->max_size,
|
||||||
.bit_rate = options->bit_rate,
|
.video_bit_rate = options->video_bit_rate,
|
||||||
.max_fps = options->max_fps,
|
.max_fps = options->max_fps,
|
||||||
.lock_video_orientation = options->lock_video_orientation,
|
.lock_video_orientation = options->lock_video_orientation,
|
||||||
.control = options->control,
|
.control = options->control,
|
||||||
|
|
|
@ -216,8 +216,8 @@ execute_server(struct sc_server *server,
|
||||||
ADD_PARAM("scid=%08x", params->scid);
|
ADD_PARAM("scid=%08x", params->scid);
|
||||||
ADD_PARAM("log_level=%s", log_level_to_server_string(params->log_level));
|
ADD_PARAM("log_level=%s", log_level_to_server_string(params->log_level));
|
||||||
|
|
||||||
if (params->bit_rate) {
|
if (params->video_bit_rate) {
|
||||||
ADD_PARAM("bit_rate=%" PRIu32, params->bit_rate);
|
ADD_PARAM("video_bit_rate=%" PRIu32, params->video_bit_rate);
|
||||||
}
|
}
|
||||||
if (!params->audio) {
|
if (!params->audio) {
|
||||||
ADD_PARAM("audio=false");
|
ADD_PARAM("audio=false");
|
||||||
|
|
|
@ -33,7 +33,7 @@ struct sc_server_params {
|
||||||
uint32_t tunnel_host;
|
uint32_t tunnel_host;
|
||||||
uint16_t tunnel_port;
|
uint16_t tunnel_port;
|
||||||
uint16_t max_size;
|
uint16_t max_size;
|
||||||
uint32_t bit_rate;
|
uint32_t video_bit_rate;
|
||||||
uint16_t max_fps;
|
uint16_t max_fps;
|
||||||
int8_t lock_video_orientation;
|
int8_t lock_video_orientation;
|
||||||
bool control;
|
bool control;
|
||||||
|
|
|
@ -46,7 +46,7 @@ static void test_options(void) {
|
||||||
char *argv[] = {
|
char *argv[] = {
|
||||||
"scrcpy",
|
"scrcpy",
|
||||||
"--always-on-top",
|
"--always-on-top",
|
||||||
"--bit-rate", "5M",
|
"--video-bit-rate", "5M",
|
||||||
"--crop", "100:200:300:400",
|
"--crop", "100:200:300:400",
|
||||||
"--fullscreen",
|
"--fullscreen",
|
||||||
"--max-fps", "30",
|
"--max-fps", "30",
|
||||||
|
@ -75,7 +75,7 @@ static void test_options(void) {
|
||||||
|
|
||||||
const struct scrcpy_options *opts = &args.opts;
|
const struct scrcpy_options *opts = &args.opts;
|
||||||
assert(opts->always_on_top);
|
assert(opts->always_on_top);
|
||||||
assert(opts->bit_rate == 5000000);
|
assert(opts->video_bit_rate == 5000000);
|
||||||
assert(!strcmp(opts->crop, "100:200:300:400"));
|
assert(!strcmp(opts->crop, "100:200:300:400"));
|
||||||
assert(opts->fullscreen);
|
assert(opts->fullscreen);
|
||||||
assert(opts->max_fps == 30);
|
assert(opts->max_fps == 30);
|
||||||
|
|
|
@ -11,7 +11,7 @@ public class Options {
|
||||||
private boolean audio = true;
|
private boolean audio = true;
|
||||||
private int maxSize;
|
private int maxSize;
|
||||||
private VideoCodec videoCodec = VideoCodec.H264;
|
private VideoCodec videoCodec = VideoCodec.H264;
|
||||||
private int bitRate = 8000000;
|
private int videoBitRate = 8000000;
|
||||||
private int maxFps;
|
private int maxFps;
|
||||||
private int lockVideoOrientation = -1;
|
private int lockVideoOrientation = -1;
|
||||||
private boolean tunnelForward;
|
private boolean tunnelForward;
|
||||||
|
@ -74,12 +74,12 @@ public class Options {
|
||||||
this.videoCodec = videoCodec;
|
this.videoCodec = videoCodec;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getBitRate() {
|
public int getVideoBitRate() {
|
||||||
return bitRate;
|
return videoBitRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBitRate(int bitRate) {
|
public void setVideoBitRate(int videoBitRate) {
|
||||||
this.bitRate = bitRate;
|
this.videoBitRate = videoBitRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxFps() {
|
public int getMaxFps() {
|
||||||
|
|
|
@ -35,18 +35,18 @@ public class ScreenEncoder implements Device.RotationListener {
|
||||||
private final Streamer streamer;
|
private final Streamer streamer;
|
||||||
private final String encoderName;
|
private final String encoderName;
|
||||||
private final List<CodecOption> codecOptions;
|
private final List<CodecOption> codecOptions;
|
||||||
private final int bitRate;
|
private final int videoBitRate;
|
||||||
private final int maxFps;
|
private final int maxFps;
|
||||||
private final boolean downsizeOnError;
|
private final boolean downsizeOnError;
|
||||||
|
|
||||||
private boolean firstFrameSent;
|
private boolean firstFrameSent;
|
||||||
private int consecutiveErrors;
|
private int consecutiveErrors;
|
||||||
|
|
||||||
public ScreenEncoder(Device device, Streamer streamer, int bitRate, int maxFps, List<CodecOption> codecOptions, String encoderName,
|
public ScreenEncoder(Device device, Streamer streamer, int videoBitRate, int maxFps, List<CodecOption> codecOptions, String encoderName,
|
||||||
boolean downsizeOnError) {
|
boolean downsizeOnError) {
|
||||||
this.device = device;
|
this.device = device;
|
||||||
this.streamer = streamer;
|
this.streamer = streamer;
|
||||||
this.bitRate = bitRate;
|
this.videoBitRate = videoBitRate;
|
||||||
this.maxFps = maxFps;
|
this.maxFps = maxFps;
|
||||||
this.codecOptions = codecOptions;
|
this.codecOptions = codecOptions;
|
||||||
this.encoderName = encoderName;
|
this.encoderName = encoderName;
|
||||||
|
@ -65,7 +65,7 @@ public class ScreenEncoder implements Device.RotationListener {
|
||||||
public void streamScreen() throws IOException, ConfigurationException {
|
public void streamScreen() throws IOException, ConfigurationException {
|
||||||
Codec codec = streamer.getCodec();
|
Codec codec = streamer.getCodec();
|
||||||
MediaCodec mediaCodec = createMediaCodec(codec, encoderName);
|
MediaCodec mediaCodec = createMediaCodec(codec, encoderName);
|
||||||
MediaFormat format = createFormat(codec.getMimeType(), bitRate, maxFps, codecOptions);
|
MediaFormat format = createFormat(codec.getMimeType(), videoBitRate, maxFps, codecOptions);
|
||||||
IBinder display = createDisplay();
|
IBinder display = createDisplay();
|
||||||
device.setRotationListener(this);
|
device.setRotationListener(this);
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ public final class Server {
|
||||||
|
|
||||||
Streamer videoStreamer = new Streamer(connection.getVideoFd(), options.getVideoCodec(), options.getSendCodecId(),
|
Streamer videoStreamer = new Streamer(connection.getVideoFd(), options.getVideoCodec(), options.getSendCodecId(),
|
||||||
options.getSendFrameMeta());
|
options.getSendFrameMeta());
|
||||||
ScreenEncoder screenEncoder = new ScreenEncoder(device, videoStreamer, options.getBitRate(), options.getMaxFps(), codecOptions,
|
ScreenEncoder screenEncoder = new ScreenEncoder(device, videoStreamer, options.getVideoBitRate(), options.getMaxFps(), codecOptions,
|
||||||
options.getEncoderName(), options.getDownsizeOnError());
|
options.getEncoderName(), options.getDownsizeOnError());
|
||||||
try {
|
try {
|
||||||
// synchronous
|
// synchronous
|
||||||
|
@ -206,9 +206,9 @@ public final class Server {
|
||||||
int maxSize = Integer.parseInt(value) & ~7; // multiple of 8
|
int maxSize = Integer.parseInt(value) & ~7; // multiple of 8
|
||||||
options.setMaxSize(maxSize);
|
options.setMaxSize(maxSize);
|
||||||
break;
|
break;
|
||||||
case "bit_rate":
|
case "video_bit_rate":
|
||||||
int bitRate = Integer.parseInt(value);
|
int videoBitRate = Integer.parseInt(value);
|
||||||
options.setBitRate(bitRate);
|
options.setVideoBitRate(videoBitRate);
|
||||||
break;
|
break;
|
||||||
case "max_fps":
|
case "max_fps":
|
||||||
int maxFps = Integer.parseInt(value);
|
int maxFps = Integer.parseInt(value);
|
||||||
|
|
Loading…
Reference in a new issue