diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 3d03b73f9..6aff46103 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2654,7 +2654,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "nsc") { - settings->NSCodec = enable; + freerdp_settings_set_bool(settings, FreeRDP_NSCodec, enable); } #if defined(WITH_JPEG) CommandLineSwitchCase(arg, "jpeg") @@ -3025,7 +3025,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } else if (strcmp(arg->Value, "nsc") == 0) { - settings->NSCodec = TRUE; + freerdp_settings_set_bool(settings, FreeRDP_NSCodec, TRUE); } #if defined(WITH_JPEG) @@ -3396,7 +3396,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, freerdp_performance_flags_make(settings); - if (settings->RemoteFxCodec || settings->NSCodec || settings->SupportGraphicsPipeline) + if (settings->RemoteFxCodec || freerdp_settings_get_bool(settings, FreeRDP_NSCodec) || + settings->SupportGraphicsPipeline) { settings->FastPathOutput = TRUE; settings->FrameMarkerCommandEnabled = TRUE; diff --git a/client/common/compatibility.c b/client/common/compatibility.c index 8f1e7e3f3..86c6bd45e 100644 --- a/client/common/compatibility.c +++ b/client/common/compatibility.c @@ -776,7 +776,7 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe } CommandLineSwitchCase(arg, "nsc") { - settings->NSCodec = TRUE; + freerdp_settings_set_bool(settings, FreeRDP_NSCodec, TRUE); WLog_WARN(TAG, "--nsc -> /nsc"); } CommandLineSwitchCase(arg, "disable-wallpaper") diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index 30edcbb1c..91381901e 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -2934,10 +2934,11 @@ static BOOL rdp_read_bitmap_codecs_capability_set(wStream* s, rdpSettings* setti if (settings->ServerMode) { + BOOL NSCodec = freerdp_settings_get_bool(settings, FreeRDP_NSCodec); /* only enable a codec if we've announced/enabled it before */ settings->RemoteFxCodec = settings->RemoteFxCodec && guidRemoteFx; settings->RemoteFxImageCodec = settings->RemoteFxImageCodec && guidRemoteFxImage; - settings->NSCodec = settings->NSCodec && guidNSCodec; + freerdp_settings_set_bool(settings, FreeRDP_NSCodec, NSCodec && guidNSCodec); settings->JpegCodec = FALSE; } @@ -3101,7 +3102,7 @@ static BOOL rdp_write_bitmap_codecs_capability_set(wStream* s, const rdpSettings if (settings->RemoteFxCodec) bitmapCodecCount++; - if (settings->NSCodec) + if (freerdp_settings_get_bool(settings, FreeRDP_NSCodec)) bitmapCodecCount++; #if defined(WITH_JPEG) @@ -3136,7 +3137,7 @@ static BOOL rdp_write_bitmap_codecs_capability_set(wStream* s, const rdpSettings } } - if (settings->NSCodec) + if (freerdp_settings_get_bool(settings, FreeRDP_NSCodec)) { rdp_write_bitmap_codec_guid(s, &CODEC_GUID_NSCODEC); /* codecGUID */ @@ -4088,7 +4089,7 @@ BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s, UINT16 pduLength) { /* client does not support bitmap codecs */ settings->RemoteFxCodec = FALSE; - settings->NSCodec = FALSE; + freerdp_settings_set_bool(settings, FreeRDP_NSCodec, FALSE); settings->JpegCodec = FALSE; } diff --git a/server/Sample/sfreerdp.c b/server/Sample/sfreerdp.c index 449a97c64..60a3138b2 100644 --- a/server/Sample/sfreerdp.c +++ b/server/Sample/sfreerdp.c @@ -191,7 +191,7 @@ static BOOL test_peer_draw_background(freerdp_peer* client) settings = client->settings; WINPR_ASSERT(settings); - if (!settings->RemoteFxCodec && !client->settings->NSCodec) + if (!settings->RemoteFxCodec && !freerdp_settings_get_bool(settings, FreeRDP_NSCodec)) return FALSE; WINPR_ASSERT(settings->DesktopWidth <= UINT16_MAX); @@ -264,7 +264,8 @@ static BOOL test_peer_load_icon(freerdp_peer* client) BYTE* rgb_data = NULL; int c; - if (!client->settings->RemoteFxCodec && !client->settings->NSCodec) + if (!client->settings->RemoteFxCodec && + !freerdp_settings_get_bool(client->settings, FreeRDP_NSCodec)) { WLog_ERR(TAG, "Client doesn't support RemoteFX or NSCodec"); return FALSE; @@ -810,7 +811,7 @@ static DWORD WINAPI test_peer_mainloop(LPVOID arg) /* client->settings->EncryptionLevel = ENCRYPTION_LEVEL_LOW; */ /* client->settings->EncryptionLevel = ENCRYPTION_LEVEL_FIPS; */ client->settings->RemoteFxCodec = TRUE; - client->settings->NSCodec = TRUE; + freerdp_settings_set_bool(client->settings, FreeRDP_NSCodec, TRUE); client->settings->ColorDepth = 32; client->settings->SuppressOutput = TRUE; client->settings->RefreshRect = TRUE; diff --git a/server/shadow/shadow.c b/server/shadow/shadow.c index eed59d4dc..f54ae1d24 100644 --- a/server/shadow/shadow.c +++ b/server/shadow/shadow.c @@ -118,6 +118,7 @@ int main(int argc, char** argv) /* By default allow all GFX modes. * This can be changed with command line flags [+|-]gfx-CODEC */ + freerdp_settings_set_bool(settings, FreeRDP_NSCodec, TRUE); freerdp_settings_set_bool(settings, FreeRDP_RemoteFxCodec, TRUE); freerdp_settings_set_bool(settings, FreeRDP_GfxH264, TRUE); freerdp_settings_set_bool(settings, FreeRDP_GfxAVC444, TRUE); diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index 9ca956e43..e8bdab762 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -156,9 +156,11 @@ static INLINE void shadow_client_free_queued_message(void* obj) static BOOL shadow_client_context_new(freerdp_peer* peer, rdpContext* context) { + BOOL NSCodec; const char bind_address[] = "bind-address,"; rdpShadowClient* client = (rdpShadowClient*)context; rdpSettings* settings; + const rdpSettings* srvSettings; rdpShadowServer* server; const wObject cb = { NULL, NULL, NULL, shadow_client_free_queued_message, NULL }; @@ -168,6 +170,9 @@ static BOOL shadow_client_context_new(freerdp_peer* peer, rdpContext* context) server = (rdpShadowServer*)peer->ContextExtra; WINPR_ASSERT(server); + srvSettings = server->settings; + WINPR_ASSERT(srvSettings); + client->server = server; client->subsystem = server->subsystem; WINPR_ASSERT(client->subsystem); @@ -175,14 +180,15 @@ static BOOL shadow_client_context_new(freerdp_peer* peer, rdpContext* context) settings = peer->settings; WINPR_ASSERT(settings); - settings->ColorDepth = 32; - settings->NSCodec = TRUE; - settings->RemoteFxCodec = TRUE; + settings->ColorDepth = srvSettings->ColorDepth; + NSCodec = freerdp_settings_get_bool(srvSettings, FreeRDP_NSCodec); + freerdp_settings_set_bool(settings, FreeRDP_NSCodec, NSCodec); + settings->RemoteFxCodec = srvSettings->RemoteFxCodec; settings->BitmapCacheV3Enabled = TRUE; settings->FrameMarkerCommandEnabled = TRUE; settings->SurfaceFrameMarkerEnabled = TRUE; settings->SupportGraphicsPipeline = TRUE; - settings->GfxH264 = FALSE; + settings->GfxH264 = srvSettings->GfxH264; settings->DrawAllowSkipAlpha = TRUE; settings->DrawAllowColorSubsampling = TRUE; settings->DrawAllowDynamicColorFidelity = TRUE; @@ -196,7 +202,6 @@ static BOOL shadow_client_context_new(freerdp_peer* peer, rdpContext* context) if (!(settings->RdpKeyFile = _strdup(settings->PrivateKeyFile))) goto fail_rdpkey_file; - if (server->ipcSocket && (strncmp(bind_address, server->ipcSocket, strnlen(bind_address, sizeof(bind_address))) != 0)) { @@ -416,7 +421,12 @@ static BOOL shadow_client_post_connect(freerdp_peer* peer) settings->ColorDepth = 16; /* disable 24bpp */ if (settings->MultifragMaxRequestSize < 0x3F0000) - settings->NSCodec = FALSE; /* NSCodec compressor does not support fragmentation yet */ + { + BOOL rc = freerdp_settings_set_bool( + settings, FreeRDP_NSCodec, + FALSE); /* NSCodec compressor does not support fragmentation yet */ + WINPR_ASSERT(rc); + } WLog_INFO(TAG, "Client from %s is activated (%" PRIu32 "x%" PRIu32 "@%" PRIu32 ")", peer->hostname, settings->DesktopWidth, settings->DesktopHeight, @@ -587,15 +597,6 @@ static BOOL shadow_client_activate(freerdp_peer* peer) client = (rdpShadowClient*)peer->context; WINPR_ASSERT(client); - if (settings->ClientDir && (strcmp(settings->ClientDir, "librdp") == 0)) - { - /* Hack for Mac/iOS/Android Microsoft RDP clients */ - settings->RemoteFxCodec = FALSE; - settings->NSCodec = FALSE; - settings->NSCodecAllowSubsampling = FALSE; - settings->SurfaceFrameMarkerEnabled = FALSE; - } - client->activated = TRUE; client->inLobby = client->mayView ? FALSE : TRUE; @@ -1336,6 +1337,7 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD rdpSettings* settings; rdpShadowEncoder* encoder; SURFACE_BITS_COMMAND cmd = { 0 }; + UINT32 nsID, rfxID; if (!context || !pSrcData) return FALSE; @@ -1350,7 +1352,9 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD if (encoder->frameAck) frameId = shadow_encoder_create_frame_id(encoder); - if (settings->RemoteFxCodec) + nsID = freerdp_settings_get_uint32(settings, FreeRDP_NSCodecId); + rfxID = freerdp_settings_get_uint32(settings, FreeRDP_RemoteFxCodecId); + if (freerdp_settings_get_bool(settings, FreeRDP_RemoteFxCodec) && (rfxID != 0)) { RFX_RECT rect; RFX_MESSAGE* messages; @@ -1377,8 +1381,8 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD } cmd.cmdType = CMDTYPE_STREAM_SURFACE_BITS; - WINPR_ASSERT(settings->RemoteFxCodecId <= UINT16_MAX); - cmd.bmp.codecID = (UINT16)settings->RemoteFxCodecId; + WINPR_ASSERT(rfxID <= UINT16_MAX); + cmd.bmp.codecID = (UINT16)rfxID; cmd.destLeft = 0; cmd.destTop = 0; cmd.destRight = settings->DesktopWidth; @@ -1433,7 +1437,7 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD free(messageRects); free(messages); } - else if (settings->NSCodec) + if (freerdp_settings_get_bool(settings, FreeRDP_NSCodec) && (nsID != 0)) { if (shadow_encoder_prepare(encoder, FREERDP_CODEC_NSCODEC) < 0) { @@ -1447,8 +1451,8 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD nsc_compose_message(encoder->nsc, s, pSrcData, nWidth, nHeight, nSrcStep); cmd.cmdType = CMDTYPE_SET_SURFACE_BITS; cmd.bmp.bpp = 32; - WINPR_ASSERT(settings->NSCodecId <= UINT16_MAX); - cmd.bmp.codecID = (UINT16)settings->NSCodecId; + WINPR_ASSERT(nsID <= UINT16_MAX); + cmd.bmp.codecID = (UINT16)nsID; cmd.destLeft = nXSrc; cmd.destTop = nYSrc; cmd.destRight = cmd.destLeft + nWidth; @@ -1816,7 +1820,7 @@ static BOOL shadow_client_send_surface_update(rdpShadowClient* client, SHADOW_GF ret = shadow_client_send_surface_gfx(client, pSrcData, nSrcStep, SrcFormat, 0, 0, (UINT16)nWidth, (UINT16)nHeight); } - else if (settings->RemoteFxCodec || settings->NSCodec) + else if (settings->RemoteFxCodec || freerdp_settings_get_bool(settings, FreeRDP_NSCodec)) { WINPR_ASSERT(nXSrc >= 0); WINPR_ASSERT(nXSrc <= UINT16_MAX);