[server,shadow] fix NSCoded and SurfaceBitsCommand

This commit is contained in:
Armin Novak 2024-07-24 14:24:12 +02:00 committed by akallabeth
parent 22585a31ce
commit 62eba8dacb
No known key found for this signature in database
GPG Key ID: A49454A3FC909FD5

View File

@ -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);