diff --git a/common/xrdp_client_info.h b/common/xrdp_client_info.h index 45965beade..f99ef17405 100644 --- a/common/xrdp_client_info.h +++ b/common/xrdp_client_info.h @@ -206,6 +206,11 @@ struct xrdp_client_info int x11_keycode_num_lock; int x11_keycode_scroll_lock; + /* xorgxrdp: frame capture interval (milliseconds) */ + int rfx_frame_interval; + int h264_frame_interval; + int normal_frame_interval; + /* ==================================================================== */ /* Private to xrdp below this line */ /* ==================================================================== */ @@ -274,6 +279,6 @@ enum xrdp_encoder_flags /* yyyymmdd of last incompatible change to xrdp_client_info */ /* also used for changes to all the xrdp installed headers */ -#define CLIENT_INFO_CURRENT_VERSION 20240805 +#define CLIENT_INFO_CURRENT_VERSION 20241118 #endif diff --git a/common/xrdp_constants.h b/common/xrdp_constants.h index 200990e0b2..0b6d4a2627 100644 --- a/common/xrdp_constants.h +++ b/common/xrdp_constants.h @@ -83,6 +83,11 @@ #define MCS_SDRQ 25 /* Send Data Request */ #define MCS_SDIN 26 /* Send Data Indication */ +/* xorgxrdp: frame capture interval (milliseconds) */ +#define DEFAULT_RFX_FRAME_INTERVAL 32 +#define DEFAULT_H264_FRAME_INTERVAL 16 +#define DEFAULT_NORMAL_FRAME_INTERVAL 40 + /****************************************************************************** * * Constants come from other Microsoft products diff --git a/xrdp/xrdp.ini.in b/xrdp/xrdp.ini.in index e855e7df4a..5bd79c78e8 100644 --- a/xrdp/xrdp.ini.in +++ b/xrdp/xrdp.ini.in @@ -249,6 +249,10 @@ password=ask port=-1 code=20 #keycode_set=evdev +; Frame capture interval (milliseconds) +h264_frame_interval=16 +rfx_frame_interval=32 +normal_frame_interval=40 [Xvnc] name=Xvnc diff --git a/xup/xup.c b/xup/xup.c index 71ced6001c..840c0df16f 100644 --- a/xup/xup.c +++ b/xup/xup.c @@ -191,6 +191,19 @@ lib_mod_connect(struct mod *mod) LOG(LOG_LEVEL_INFO, "XKB rules '%s' will be used by the module", mod->client_info.xkb_rules); + if (mod->client_info.h264_frame_interval <= 0) + { + mod->client_info.h264_frame_interval = DEFAULT_H264_FRAME_INTERVAL; + } + if (mod->client_info.rfx_frame_interval <= 0) + { + mod->client_info.rfx_frame_interval = DEFAULT_RFX_FRAME_INTERVAL; + } + if (mod->client_info.normal_frame_interval <= 0) + { + mod->client_info.normal_frame_interval = DEFAULT_NORMAL_FRAME_INTERVAL; + } + make_stream(s); g_sprintf(con_port, "%s", mod->port); @@ -1887,6 +1900,18 @@ lib_mod_set_param(struct mod *mod, const char *name, const char *value) { g_snprintf(mod->keycode_set, sizeof(mod->keycode_set), "%s", value); } + else if (g_strcasecmp(name, "h264_frame_interval") == 0) + { + mod->client_info.h264_frame_interval = g_atoi(value); + } + else if (g_strcasecmp(name, "rfx_frame_interval") == 0) + { + mod->client_info.rfx_frame_interval = g_atoi(value); + } + else if (g_strcasecmp(name, "normal_frame_interval") == 0) + { + mod->client_info.normal_frame_interval = g_atoi(value); + } else if (g_strcasecmp(name, "client_info") == 0) { g_memcpy(&(mod->client_info), value, sizeof(mod->client_info));