From 62eba8dacb1d0cee40b172819c878061a6fe144a Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 24 Jul 2024 14:24:12 +0200 Subject: [PATCH] [server,shadow] fix NSCoded and SurfaceBitsCommand --- server/shadow/shadow_client.c | 43 +++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index 68d19a151..6da65f2ce 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -1361,6 +1361,39 @@ static BOOL shadow_client_send_surface_gfx(rdpShadowClient* client, const BYTE* return TRUE; } +static BOOL stream_surface_bits_supported(const rdpSettings* settings) +{ + const UINT32 supported = + freerdp_settings_get_uint32(settings, FreeRDP_SurfaceCommandsSupported); + return ((supported & SURFCMDS_STREAM_SURFACE_BITS) != 0); +} + +static BOOL set_surface_bits_supported(const rdpSettings* settings) +{ + const UINT32 supported = + freerdp_settings_get_uint32(settings, FreeRDP_SurfaceCommandsSupported); + return ((supported & SURFCMDS_SET_SURFACE_BITS) != 0); +} + +static BOOL is_surface_command_supported(const rdpSettings* settings) +{ + if (stream_surface_bits_supported(settings)) + { + const UINT32 rfxID = freerdp_settings_get_uint32(settings, FreeRDP_RemoteFxCodecId); + const BOOL supported = freerdp_settings_get_bool(settings, FreeRDP_RemoteFxCodec); + if (supported && (rfxID != 0)) + return TRUE; + } + if (set_surface_bits_supported(settings)) + { + const UINT32 nsID = freerdp_settings_get_uint32(settings, FreeRDP_NSCodecId); + const BOOL supported = freerdp_settings_get_bool(settings, FreeRDP_NSCodec); + if (supported && (nsID != 0)) + return TRUE; + } + return FALSE; +} + /** * Function description * @@ -1398,7 +1431,8 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD // TODO: Check FreeRDP_RemoteFxCodecMode if we should send RFX IMAGE or VIDEO data const UINT32 nsID = freerdp_settings_get_uint32(settings, FreeRDP_NSCodecId); const UINT32 rfxID = freerdp_settings_get_uint32(settings, FreeRDP_RemoteFxCodecId); - if (freerdp_settings_get_bool(settings, FreeRDP_RemoteFxCodec) && (rfxID != 0)) + if (stream_surface_bits_supported(settings) && + freerdp_settings_get_bool(settings, FreeRDP_RemoteFxCodec) && (rfxID != 0)) { RFX_RECT rect = { 0 }; @@ -1475,7 +1509,8 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD rfx_message_list_free(messages); } - if (freerdp_settings_get_bool(settings, FreeRDP_NSCodec) && (nsID != 0)) + else if (set_surface_bits_supported(settings) && + freerdp_settings_get_bool(settings, FreeRDP_NSCodec) && (nsID != 0)) { if (shadow_encoder_prepare(encoder, FREERDP_CODEC_NSCODEC) < 0) { @@ -1871,9 +1906,7 @@ static BOOL shadow_client_send_surface_update(rdpShadowClient* client, SHADOW_GF ret = TRUE; } } - else if (freerdp_settings_get_bool(settings, FreeRDP_SurfaceCommandsEnabled) && - (freerdp_settings_get_bool(settings, FreeRDP_RemoteFxCodec) || - freerdp_settings_get_bool(settings, FreeRDP_NSCodec))) + else if (is_surface_command_supported(settings)) { WINPR_ASSERT(nXSrc >= 0); WINPR_ASSERT(nXSrc <= UINT16_MAX);