mirror of
https://github.com/Genymobile/scrcpy
synced 2024-12-23 23:53:46 +00:00
55806e7d31
This flag forced the decoder to wait for the previous frame to be
consumed by the display.
It was initially implemented as a compilation flag for testing, not
intended to be exposed at runtime. But to remove ifdefs and to allow
users to test this flag easily, it had finally been exposed by commit
ebccb9f6cc
.
In practice, it turned out to be useless: it had no practical impact,
and it did not solve or mitigate any performance issues causing frame
skipping.
But that added some complexity to the codebase: it required an
additional condition variable, and made video buffer calls possibly
blocking, which in turn required code to interrupt it on exit.
To prepare support for multiple sinks plugged to the decoder (display
and v4l2 for example), the blocking call used for pacing the decoder
output becomes unacceptable, so just remove this useless "feature".
173 lines
4.6 KiB
C
173 lines
4.6 KiB
C
#include "common.h"
|
|
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
#include "cli.h"
|
|
#include "scrcpy.h"
|
|
|
|
static void test_flag_version(void) {
|
|
struct scrcpy_cli_args args = {
|
|
.opts = SCRCPY_OPTIONS_DEFAULT,
|
|
.help = false,
|
|
.version = false,
|
|
};
|
|
|
|
char *argv[] = {"scrcpy", "-v"};
|
|
|
|
bool ok = scrcpy_parse_args(&args, 2, argv);
|
|
assert(ok);
|
|
assert(!args.help);
|
|
assert(args.version);
|
|
}
|
|
|
|
static void test_flag_help(void) {
|
|
struct scrcpy_cli_args args = {
|
|
.opts = SCRCPY_OPTIONS_DEFAULT,
|
|
.help = false,
|
|
.version = false,
|
|
};
|
|
|
|
char *argv[] = {"scrcpy", "-v"};
|
|
|
|
bool ok = scrcpy_parse_args(&args, 2, argv);
|
|
assert(ok);
|
|
assert(!args.help);
|
|
assert(args.version);
|
|
}
|
|
|
|
static void test_options(void) {
|
|
struct scrcpy_cli_args args = {
|
|
.opts = SCRCPY_OPTIONS_DEFAULT,
|
|
.help = false,
|
|
.version = false,
|
|
};
|
|
|
|
char *argv[] = {
|
|
"scrcpy",
|
|
"--always-on-top",
|
|
"--bit-rate", "5M",
|
|
"--crop", "100:200:300:400",
|
|
"--fullscreen",
|
|
"--max-fps", "30",
|
|
"--max-size", "1024",
|
|
"--lock-video-orientation", "2",
|
|
// "--no-control" is not compatible with "--turn-screen-off"
|
|
// "--no-display" is not compatible with "--fulscreen"
|
|
"--port", "1234:1236",
|
|
"--push-target", "/sdcard/Movies",
|
|
"--record", "file",
|
|
"--record-format", "mkv",
|
|
"--serial", "0123456789abcdef",
|
|
"--show-touches",
|
|
"--turn-screen-off",
|
|
"--prefer-text",
|
|
"--window-title", "my device",
|
|
"--window-x", "100",
|
|
"--window-y", "-1",
|
|
"--window-width", "600",
|
|
"--window-height", "0",
|
|
"--window-borderless",
|
|
};
|
|
|
|
bool ok = scrcpy_parse_args(&args, ARRAY_LEN(argv), argv);
|
|
assert(ok);
|
|
|
|
const struct scrcpy_options *opts = &args.opts;
|
|
assert(opts->always_on_top);
|
|
assert(opts->bit_rate == 5000000);
|
|
assert(!strcmp(opts->crop, "100:200:300:400"));
|
|
assert(opts->fullscreen);
|
|
assert(opts->max_fps == 30);
|
|
assert(opts->max_size == 1024);
|
|
assert(opts->lock_video_orientation == 2);
|
|
assert(opts->port_range.first == 1234);
|
|
assert(opts->port_range.last == 1236);
|
|
assert(!strcmp(opts->push_target, "/sdcard/Movies"));
|
|
assert(!strcmp(opts->record_filename, "file"));
|
|
assert(opts->record_format == SC_RECORD_FORMAT_MKV);
|
|
assert(!strcmp(opts->serial, "0123456789abcdef"));
|
|
assert(opts->show_touches);
|
|
assert(opts->turn_screen_off);
|
|
assert(opts->prefer_text);
|
|
assert(!strcmp(opts->window_title, "my device"));
|
|
assert(opts->window_x == 100);
|
|
assert(opts->window_y == -1);
|
|
assert(opts->window_width == 600);
|
|
assert(opts->window_height == 0);
|
|
assert(opts->window_borderless);
|
|
}
|
|
|
|
static void test_options2(void) {
|
|
struct scrcpy_cli_args args = {
|
|
.opts = SCRCPY_OPTIONS_DEFAULT,
|
|
.help = false,
|
|
.version = false,
|
|
};
|
|
|
|
char *argv[] = {
|
|
"scrcpy",
|
|
"--no-control",
|
|
"--no-display",
|
|
"--record", "file.mp4", // cannot enable --no-display without recording
|
|
};
|
|
|
|
bool ok = scrcpy_parse_args(&args, ARRAY_LEN(argv), argv);
|
|
assert(ok);
|
|
|
|
const struct scrcpy_options *opts = &args.opts;
|
|
assert(!opts->control);
|
|
assert(!opts->display);
|
|
assert(!strcmp(opts->record_filename, "file.mp4"));
|
|
assert(opts->record_format == SC_RECORD_FORMAT_MP4);
|
|
}
|
|
|
|
static void test_parse_shortcut_mods(void) {
|
|
struct sc_shortcut_mods mods;
|
|
bool ok;
|
|
|
|
ok = sc_parse_shortcut_mods("lctrl", &mods);
|
|
assert(ok);
|
|
assert(mods.count == 1);
|
|
assert(mods.data[0] == SC_MOD_LCTRL);
|
|
|
|
ok = sc_parse_shortcut_mods("lctrl+lalt", &mods);
|
|
assert(ok);
|
|
assert(mods.count == 1);
|
|
assert(mods.data[0] == (SC_MOD_LCTRL | SC_MOD_LALT));
|
|
|
|
ok = sc_parse_shortcut_mods("rctrl,lalt", &mods);
|
|
assert(ok);
|
|
assert(mods.count == 2);
|
|
assert(mods.data[0] == SC_MOD_RCTRL);
|
|
assert(mods.data[1] == SC_MOD_LALT);
|
|
|
|
ok = sc_parse_shortcut_mods("lsuper,rsuper+lalt,lctrl+rctrl+ralt", &mods);
|
|
assert(ok);
|
|
assert(mods.count == 3);
|
|
assert(mods.data[0] == SC_MOD_LSUPER);
|
|
assert(mods.data[1] == (SC_MOD_RSUPER | SC_MOD_LALT));
|
|
assert(mods.data[2] == (SC_MOD_LCTRL | SC_MOD_RCTRL | SC_MOD_RALT));
|
|
|
|
ok = sc_parse_shortcut_mods("", &mods);
|
|
assert(!ok);
|
|
|
|
ok = sc_parse_shortcut_mods("lctrl+", &mods);
|
|
assert(!ok);
|
|
|
|
ok = sc_parse_shortcut_mods("lctrl,", &mods);
|
|
assert(!ok);
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
(void) argc;
|
|
(void) argv;
|
|
|
|
test_flag_version();
|
|
test_flag_help();
|
|
test_options();
|
|
test_options2();
|
|
test_parse_shortcut_mods();
|
|
return 0;
|
|
};
|