@ -41,6 +41,12 @@ scrcpy_print_usage(const char *arg0) {
" -h, --help \n "
" Print this help. \n "
" \n "
" --lock-video-orientation value \n "
" Lock video orientation to value. Values are integers in the \n "
" range [-1..3]. Natural device orientation is 0 and each \n "
" increment adds 90 degrees counterclockwise. \n "
" Default is %d%s. \n "
" \n "
" --max-fps value \n "
" Limit the frame rate of screen capture (officially supported \n "
" since Android 10, but may work on earlier versions). \n "
@ -192,6 +198,7 @@ scrcpy_print_usage(const char *arg0) {
" \n " ,
arg0 ,
DEFAULT_BIT_RATE ,
DEFAULT_LOCK_VIDEO_ORIENTATION , DEFAULT_LOCK_VIDEO_ORIENTATION > = 0 ? " " : " (unlocked) " ,
DEFAULT_MAX_SIZE , DEFAULT_MAX_SIZE ? " " : " (unlimited) " ,
DEFAULT_LOCAL_PORT_RANGE_FIRST , DEFAULT_LOCAL_PORT_RANGE_LAST ) ;
}
@ -280,6 +287,19 @@ parse_max_fps(const char *s, uint16_t *max_fps) {
return true ;
}
static bool
parse_lock_video_orientation ( const char * s , int8_t * lock_video_orientation ) {
long value ;
bool ok = parse_integer_arg ( s , & value , false , - 1 , 3 ,
" lock video orientation " ) ;
if ( ! ok ) {
return false ;
}
* lock_video_orientation = ( int8_t ) value ;
return true ;
}
static bool
parse_window_position ( const char * s , int16_t * position ) {
long value ;
@ -364,51 +384,54 @@ guess_record_format(const char *filename) {
return 0 ;
}
# define OPT_RENDER_EXPIRED_FRAMES 1000
# define OPT_WINDOW_TITLE 1001
# define OPT_PUSH_TARGET 1002
# define OPT_ALWAYS_ON_TOP 1003
# define OPT_CROP 1004
# define OPT_RECORD_FORMAT 1005
# define OPT_PREFER_TEXT 1006
# define OPT_WINDOW_X 1007
# define OPT_WINDOW_Y 1008
# define OPT_WINDOW_WIDTH 1009
# define OPT_WINDOW_HEIGHT 1010
# define OPT_WINDOW_BORDERLESS 1011
# define OPT_MAX_FPS 1012
# define OPT_RENDER_EXPIRED_FRAMES 1000
# define OPT_WINDOW_TITLE 1001
# define OPT_PUSH_TARGET 1002
# define OPT_ALWAYS_ON_TOP 1003
# define OPT_CROP 1004
# define OPT_RECORD_FORMAT 1005
# define OPT_PREFER_TEXT 1006
# define OPT_WINDOW_X 1007
# define OPT_WINDOW_Y 1008
# define OPT_WINDOW_WIDTH 1009
# define OPT_WINDOW_HEIGHT 1010
# define OPT_WINDOW_BORDERLESS 1011
# define OPT_MAX_FPS 1012
# define OPT_LOCK_VIDEO_ORIENTATION 1013
bool
scrcpy_parse_args ( struct scrcpy_cli_args * args , int argc , char * argv [ ] ) {
static const struct option long_options [ ] = {
{ " always-on-top " , no_argument , NULL , OPT_ALWAYS_ON_TOP } ,
{ " bit-rate " , required_argument , NULL , ' b ' } ,
{ " crop " , required_argument , NULL , OPT_CROP } ,
{ " fullscreen " , no_argument , NULL , ' f ' } ,
{ " help " , no_argument , NULL , ' h ' } ,
{ " max-fps " , required_argument , NULL , OPT_MAX_FPS } ,
{ " max-size " , required_argument , NULL , ' m ' } ,
{ " no-control " , no_argument , NULL , ' n ' } ,
{ " no-display " , no_argument , NULL , ' N ' } ,
{ " port " , required_argument , NULL , ' p ' } ,
{ " push-target " , required_argument , NULL , OPT_PUSH_TARGET } ,
{ " record " , required_argument , NULL , ' r ' } ,
{ " record-format " , required_argument , NULL , OPT_RECORD_FORMAT } ,
{ " render-expired-frames " , no_argument , NULL ,
OPT_RENDER_EXPIRED_FRAMES } ,
{ " serial " , required_argument , NULL , ' s ' } ,
{ " show-touches " , no_argument , NULL , ' t ' } ,
{ " turn-screen-off " , no_argument , NULL , ' S ' } ,
{ " prefer-text " , no_argument , NULL , OPT_PREFER_TEXT } ,
{ " version " , no_argument , NULL , ' v ' } ,
{ " window-title " , required_argument , NULL , OPT_WINDOW_TITLE } ,
{ " window-x " , required_argument , NULL , OPT_WINDOW_X } ,
{ " window-y " , required_argument , NULL , OPT_WINDOW_Y } ,
{ " window-width " , required_argument , NULL , OPT_WINDOW_WIDTH } ,
{ " window-height " , required_argument , NULL , OPT_WINDOW_HEIGHT } ,
{ " window-borderless " , no_argument , NULL ,
OPT_WINDOW_BORDERLESS } ,
{ NULL , 0 , NULL , 0 } ,
{ " always-on-top " , no_argument , NULL , OPT_ALWAYS_ON_TOP } ,
{ " bit-rate " , required_argument , NULL , ' b ' } ,
{ " crop " , required_argument , NULL , OPT_CROP } ,
{ " fullscreen " , no_argument , NULL , ' f ' } ,
{ " help " , no_argument , NULL , ' h ' } ,
{ " lock-video-orientation " , required_argument , NULL ,
OPT_LOCK_VIDEO_ORIENTATION } ,
{ " max-fps " , required_argument , NULL , OPT_MAX_FPS } ,
{ " max-size " , required_argument , NULL , ' m ' } ,
{ " no-control " , no_argument , NULL , ' n ' } ,
{ " no-display " , no_argument , NULL , ' N ' } ,
{ " port " , required_argument , NULL , ' p ' } ,
{ " push-target " , required_argument , NULL , OPT_PUSH_TARGET } ,
{ " record " , required_argument , NULL , ' r ' } ,
{ " record-format " , required_argument , NULL , OPT_RECORD_FORMAT } ,
{ " render-expired-frames " , no_argument , NULL ,
OPT_RENDER_EXPIRED_FRAMES } ,
{ " serial " , required_argument , NULL , ' s ' } ,
{ " show-touches " , no_argument , NULL , ' t ' } ,
{ " turn-screen-off " , no_argument , NULL , ' S ' } ,
{ " prefer-text " , no_argument , NULL , OPT_PREFER_TEXT } ,
{ " version " , no_argument , NULL , ' v ' } ,
{ " window-title " , required_argument , NULL , OPT_WINDOW_TITLE } ,
{ " window-x " , required_argument , NULL , OPT_WINDOW_X } ,
{ " window-y " , required_argument , NULL , OPT_WINDOW_Y } ,
{ " window-width " , required_argument , NULL , OPT_WINDOW_WIDTH } ,
{ " window-height " , required_argument , NULL , OPT_WINDOW_HEIGHT } ,
{ " window-borderless " , no_argument , NULL ,
OPT_WINDOW_BORDERLESS } ,
{ NULL , 0 , NULL , 0 } ,
} ;
struct scrcpy_options * opts = & args - > opts ;
@ -454,6 +477,11 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) {
return false ;
}
break ;
case OPT_LOCK_VIDEO_ORIENTATION :
if ( ! parse_lock_video_orientation ( optarg , & opts - > lock_video_orientation ) ) {
return false ;
}
break ;
case ' n ' :
opts - > control = false ;
break ;