From 1d9722f8d8142e69ec2ff43773d98a06f446d648 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 16 Dec 2019 07:53:35 +0100 Subject: [PATCH] Added /gfx and /gfx-h264 option mask= With this new option the gfx capability set can be masked to only announce older versions of the protocol if required. (Fixes #5771) --- client/common/cmdline.c | 90 +++++++++++++++++++++++++++++++---------- client/common/cmdline.h | 8 ++-- 2 files changed, 72 insertions(+), 26 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index de16953d8..4e9a11dba 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2452,28 +2452,50 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (arg->Value) { -#ifdef WITH_GFX_H264 + int rc = CHANNEL_RC_OK; + char** p; + size_t count, x; - if (_strnicmp("AVC444", arg->Value, 7) == 0) + p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count); + if (!p || (count == 0)) + rc = COMMAND_LINE_ERROR; + for (x = 0; x < count; x++) { - settings->GfxH264 = TRUE; - settings->GfxAVC444 = TRUE; - } - else if (_strnicmp("AVC420", arg->Value, 7) == 0) - { - settings->GfxH264 = TRUE; - settings->GfxAVC444 = FALSE; - } - else + const char* val = p[x]; +#ifdef WITH_GFX_H264 + if (_strnicmp("AVC444", val, 7) == 0) + { + settings->GfxH264 = TRUE; + settings->GfxAVC444 = TRUE; + } + else if (_strnicmp("AVC420", val, 7) == 0) + { + settings->GfxH264 = TRUE; + settings->GfxAVC444 = FALSE; + } + else #endif - if (_strnicmp("RFX", arg->Value, 4) == 0) - { - settings->GfxAVC444 = FALSE; - settings->GfxH264 = FALSE; - settings->RemoteFxCodec = TRUE; + if (_strnicmp("RFX", val, 4) == 0) + { + settings->GfxAVC444 = FALSE; + settings->GfxH264 = FALSE; + settings->RemoteFxCodec = TRUE; + } + else if (_strnicmp("mask:", val, 5) == 0) + { + ULONGLONG v; + const char* uv = &val[5]; + if (!value_to_uint(uv, &v, 0, UINT32_MAX)) + rc = COMMAND_LINE_ERROR; + else + settings->GfxCapsFilter = (UINT32)v; + } + else + rc = COMMAND_LINE_ERROR; } - else - return COMMAND_LINE_ERROR; + free(p); + if (rc != CHANNEL_RC_OK) + return rc; } } CommandLineSwitchCase(arg, "gfx-thin-client") @@ -2508,12 +2530,36 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (arg->Value) { - if (_strnicmp("AVC444", arg->Value, 7) == 0) + int rc = CHANNEL_RC_OK; + char** p; + size_t count, x; + + p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count); + if (!p || (count == 0)) + rc = COMMAND_LINE_ERROR; + for (x = 0; x < count; x++) { - settings->GfxAVC444 = TRUE; + const char* val = p[x]; + + if (_strnicmp("AVC444", val, 7) == 0) + { + settings->GfxAVC444 = TRUE; + } + else if (_strnicmp("AVC420", val, 7) != 0) + rc = COMMAND_LINE_ERROR; + else if (_strnicmp("mask:", val, 5) == 0) + { + ULONGLONG v; + const char* uv = &val[5]; + if (!value_to_uint(uv, &v, 0, UINT32_MAX)) + rc = COMMAND_LINE_ERROR; + else + settings->GfxCapsFilter = (UINT32)v; + } } - else if (_strnicmp("AVC420", arg->Value, 7) != 0) - return COMMAND_LINE_ERROR; + free(p); + if (rc != CHANNEL_RC_OK) + return rc; } } #endif diff --git a/client/common/cmdline.h b/client/common/cmdline.h index e47a26449..3e281a746 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -132,10 +132,10 @@ static const COMMAND_LINE_ARGUMENT_A args[] = { { "gestures", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Consume multitouch input locally" }, #ifdef WITH_GFX_H264 - { "gfx", COMMAND_LINE_VALUE_OPTIONAL, "[RFX|AVC420|AVC444]", NULL, NULL, -1, NULL, - "RDP8 graphics pipeline" }, - { "gfx-h264", COMMAND_LINE_VALUE_OPTIONAL, "[AVC420|AVC444]", NULL, NULL, -1, NULL, - "RDP8.1 graphics pipeline using H264 codec" }, + { "gfx", COMMAND_LINE_VALUE_OPTIONAL, "[[RFX|AVC420|AVC444],mask:]", NULL, NULL, -1, + NULL, "RDP8 graphics pipeline" }, + { "gfx-h264", COMMAND_LINE_VALUE_OPTIONAL, "[[AVC420|AVC444],mask:]", NULL, NULL, -1, + NULL, "RDP8.1 graphics pipeline using H264 codec" }, #else { "gfx", COMMAND_LINE_VALUE_OPTIONAL, "RFX", NULL, NULL, -1, NULL, "RDP8 graphics pipeline" }, #endif