From c55694c51b570d84ad63bfb5dc7bdec75fee57da Mon Sep 17 00:00:00 2001 From: Koichiro Iwao Date: Sat, 16 Nov 2024 00:00:00 +0900 Subject: [PATCH 1/3] Set different frame capture interval for H.264 and RFX and pass them to xorgxrdp. --- common/xrdp_client_info.h | 7 ++++++- common/xrdp_constants.h | 5 +++++ xrdp/xrdp.ini.in | 4 ++++ xup/xup.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/common/xrdp_client_info.h b/common/xrdp_client_info.h index 32f593cce3..d31495b91f 100644 --- a/common/xrdp_client_info.h +++ b/common/xrdp_client_info.h @@ -241,6 +241,11 @@ struct xrdp_client_info int pad1; /* unused; unicode_input_state */ enum xrdp_capture_code capture_code; + + /* xorgxrdp: frame capture interval (milliseconds) */ + int rfx_frame_interval; + int h264_frame_interval; + int normal_frame_interval; }; enum xrdp_encoder_flags @@ -260,6 +265,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 20240514 +#define CLIENT_INFO_CURRENT_VERSION 20241118 #endif diff --git a/common/xrdp_constants.h b/common/xrdp_constants.h index 9ab9d17901..c60f1787dd 100644 --- a/common/xrdp_constants.h +++ b/common/xrdp_constants.h @@ -86,6 +86,11 @@ #define MCS_SDRQ 25 /* Send Data Request */ #define MCS_SDIN 26 /* Send Data Indication */ +/* xorgxrdp: frame capture interval (milliseconds) */ +#define RFX_FRAME_INTERVAL 32 +#define H264_FRAME_INTERVAL 16 +#define NORMAL_FRAME_INTERVAL 40 + /****************************************************************************** * * Constants come from other Microsoft products diff --git a/xrdp/xrdp.ini.in b/xrdp/xrdp.ini.in index c240ebfdde..ccbbb1be13 100644 --- a/xrdp/xrdp.ini.in +++ b/xrdp/xrdp.ini.in @@ -242,6 +242,10 @@ username=ask password=ask port=-1 code=20 +; 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 fc96c58f0f..d436e0a02c 100644 --- a/xup/xup.c +++ b/xup/xup.c @@ -170,6 +170,22 @@ lib_mod_connect(struct mod *mod) return 1; } + + // This is a good place to finalise any parameters that need to + // be set. + if (mod->client_info.h264_frame_interval <= 0) + { + mod->client_info.h264_frame_interval = H264_FRAME_INTERVAL; + } + if (mod->client_info.rfx_frame_interval <= 0) + { + mod->client_info.rfx_frame_interval = RFX_FRAME_INTERVAL; + } + if (mod->client_info.normal_frame_interval <= 0) + { + mod->client_info.normal_frame_interval = NORMAL_FRAME_INTERVAL; + } + make_stream(s); g_sprintf(con_port, "%s", mod->port); @@ -1855,6 +1871,18 @@ lib_mod_set_param(struct mod *mod, const char *name, const char *value) { g_strncpy(mod->port, value, 255); } + 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)); From 65f9ae4afbd5c8c4c608a9014177542d7d4f51a6 Mon Sep 17 00:00:00 2001 From: Koichiro Iwao Date: Tue, 19 Nov 2024 21:06:53 +0900 Subject: [PATCH 2/3] Add DEFAULT_ prefix for default frame capture intervals --- common/xrdp_constants.h | 6 +++--- xup/xup.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/xrdp_constants.h b/common/xrdp_constants.h index c60f1787dd..d1e5a1d927 100644 --- a/common/xrdp_constants.h +++ b/common/xrdp_constants.h @@ -87,9 +87,9 @@ #define MCS_SDIN 26 /* Send Data Indication */ /* xorgxrdp: frame capture interval (milliseconds) */ -#define RFX_FRAME_INTERVAL 32 -#define H264_FRAME_INTERVAL 16 -#define NORMAL_FRAME_INTERVAL 40 +#define DEFAULT_RFX_FRAME_INTERVAL 32 +#define DEFAULT_H264_FRAME_INTERVAL 16 +#define DEFAULT_NORMAL_FRAME_INTERVAL 40 /****************************************************************************** * diff --git a/xup/xup.c b/xup/xup.c index d436e0a02c..2f8d0dad77 100644 --- a/xup/xup.c +++ b/xup/xup.c @@ -175,15 +175,15 @@ lib_mod_connect(struct mod *mod) // be set. if (mod->client_info.h264_frame_interval <= 0) { - mod->client_info.h264_frame_interval = H264_FRAME_INTERVAL; + mod->client_info.h264_frame_interval = DEFAULT_H264_FRAME_INTERVAL; } if (mod->client_info.rfx_frame_interval <= 0) { - mod->client_info.rfx_frame_interval = RFX_FRAME_INTERVAL; + mod->client_info.rfx_frame_interval = DEFAULT_RFX_FRAME_INTERVAL; } if (mod->client_info.normal_frame_interval <= 0) { - mod->client_info.normal_frame_interval = NORMAL_FRAME_INTERVAL; + mod->client_info.normal_frame_interval = DEFAULT_NORMAL_FRAME_INTERVAL; } make_stream(s); From 56b4ca051e31650c836cab76eaf3e195117269bb Mon Sep 17 00:00:00 2001 From: Koichiro Iwao Date: Tue, 19 Nov 2024 21:07:41 +0900 Subject: [PATCH 3/3] Frame capture intervals are not private to xrdp --- common/xrdp_client_info.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/xrdp_client_info.h b/common/xrdp_client_info.h index d31495b91f..390d6adb98 100644 --- a/common/xrdp_client_info.h +++ b/common/xrdp_client_info.h @@ -192,6 +192,11 @@ struct xrdp_client_info char variant[16]; char options[256]; + /* xorgxrdp: frame capture interval (milliseconds) */ + int rfx_frame_interval; + int h264_frame_interval; + int normal_frame_interval; + /* ==================================================================== */ /* Private to xrdp below this line */ /* ==================================================================== */ @@ -241,11 +246,6 @@ struct xrdp_client_info int pad1; /* unused; unicode_input_state */ enum xrdp_capture_code capture_code; - - /* xorgxrdp: frame capture interval (milliseconds) */ - int rfx_frame_interval; - int h264_frame_interval; - int normal_frame_interval; }; enum xrdp_encoder_flags