server: fix surface command types

- Legacy RemoteFX is encapsulated in a "Stream Surface Bits Command" (CMDTYPE_STREAM_SURFACE_BITS)
- NSCodec is encapsulated in a "Set Surface Bits Command" (CMDTYPE_SET_SURFACE_BITS)

References:
- MS-RDPRFX 3.1.8.3.1 RemoteFX Stream / Encode Message Sequencing
- MS-RDPNSC 2.2.2 NSCodec Compressed Bitmap Stream
This commit is contained in:
Norbert Federa 2020-04-03 14:04:12 +02:00 committed by akallabeth
parent d65de64676
commit e3b3b52f6a
3 changed files with 24 additions and 16 deletions

View File

@ -201,6 +201,7 @@ static BOOL test_peer_draw_background(freerdp_peer* client)
if (client->settings->RemoteFxCodec)
{
WLog_DBG(TAG, "Using RemoteFX codec");
if (!rfx_compose_message(context->rfx_context, s, &rect, 1, rgb_data, rect.width,
rect.height, rect.width * 3))
{
@ -208,15 +209,17 @@ static BOOL test_peer_draw_background(freerdp_peer* client)
}
cmd.bmp.codecID = client->settings->RemoteFxCodecId;
cmd.cmdType = CMDTYPE_STREAM_SURFACE_BITS;
}
else
{
WLog_DBG(TAG, "Using NSCodec");
nsc_compose_message(context->nsc_context, s, rgb_data, rect.width, rect.height,
rect.width * 3);
cmd.bmp.codecID = client->settings->NSCodecId;
cmd.cmdType = CMDTYPE_SET_SURFACE_BITS;
}
cmd.cmdType = CMDTYPE_SET_SURFACE_BITS;
cmd.destLeft = 0;
cmd.destTop = 0;
cmd.destRight = rect.width;
@ -322,24 +325,28 @@ static void test_peer_draw_icon(freerdp_peer* client, int x, int y)
rect.width = context->icon_width;
rect.height = context->icon_height;
if (client->settings->RemoteFxCodec)
{
cmd.bmp.codecID = client->settings->RemoteFxCodecId;
cmd.cmdType = CMDTYPE_STREAM_SURFACE_BITS;
}
else
{
cmd.bmp.codecID = client->settings->NSCodecId;
cmd.cmdType = CMDTYPE_SET_SURFACE_BITS;
}
if (context->icon_x >= 0)
{
s = test_peer_stream_init(context);
if (client->settings->RemoteFxCodec)
{
rfx_compose_message(context->rfx_context, s, &rect, 1, context->bg_data, rect.width,
rect.height, rect.width * 3);
cmd.bmp.codecID = client->settings->RemoteFxCodecId;
}
else
{
nsc_compose_message(context->nsc_context, s, context->bg_data, rect.width, rect.height,
rect.width * 3);
cmd.bmp.codecID = client->settings->NSCodecId;
}
cmd.cmdType = CMDTYPE_SET_SURFACE_BITS;
cmd.destLeft = context->icon_x;
cmd.destTop = context->icon_y;
cmd.destRight = context->icon_x + context->icon_width;
@ -356,19 +363,12 @@ static void test_peer_draw_icon(freerdp_peer* client, int x, int y)
s = test_peer_stream_init(context);
if (client->settings->RemoteFxCodec)
{
rfx_compose_message(context->rfx_context, s, &rect, 1, context->icon_data, rect.width,
rect.height, rect.width * 3);
cmd.bmp.codecID = client->settings->RemoteFxCodecId;
}
else
{
nsc_compose_message(context->nsc_context, s, context->icon_data, rect.width, rect.height,
rect.width * 3);
cmd.bmp.codecID = client->settings->NSCodecId;
}
cmd.cmdType = CMDTYPE_SET_SURFACE_BITS;
cmd.destLeft = x;
cmd.destTop = y;
cmd.destRight = x + context->icon_width;
@ -790,6 +790,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;
client->settings->ColorDepth = 32;
client->settings->SuppressOutput = TRUE;
client->settings->RefreshRect = TRUE;

View File

@ -976,7 +976,7 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD
return FALSE;
}
cmd.cmdType = CMDTYPE_SET_SURFACE_BITS;
cmd.cmdType = CMDTYPE_STREAM_SURFACE_BITS;
cmd.bmp.codecID = settings->RemoteFxCodecId;
cmd.destLeft = 0;
cmd.destTop = 0;

View File

@ -24,6 +24,8 @@
#include "shadow_encoder.h"
#define TAG CLIENT_TAG("shadow")
int shadow_encoder_preferred_fps(rdpShadowEncoder* encoder)
{
/* Return preferred fps calculated according to the last
@ -400,6 +402,7 @@ int shadow_encoder_prepare(rdpShadowEncoder* encoder, UINT32 codecs)
if ((codecs & FREERDP_CODEC_REMOTEFX) && !(encoder->codecs & FREERDP_CODEC_REMOTEFX))
{
WLog_DBG(TAG, "initializing RemoteFX encoder");
status = shadow_encoder_init_rfx(encoder);
if (status < 0)
@ -408,6 +411,7 @@ int shadow_encoder_prepare(rdpShadowEncoder* encoder, UINT32 codecs)
if ((codecs & FREERDP_CODEC_NSCODEC) && !(encoder->codecs & FREERDP_CODEC_NSCODEC))
{
WLog_DBG(TAG, "initializing NSCodec encoder");
status = shadow_encoder_init_nsc(encoder);
if (status < 0)
@ -416,6 +420,7 @@ int shadow_encoder_prepare(rdpShadowEncoder* encoder, UINT32 codecs)
if ((codecs & FREERDP_CODEC_PLANAR) && !(encoder->codecs & FREERDP_CODEC_PLANAR))
{
WLog_DBG(TAG, "initializing planar bitmap encoder");
status = shadow_encoder_init_planar(encoder);
if (status < 0)
@ -424,6 +429,7 @@ int shadow_encoder_prepare(rdpShadowEncoder* encoder, UINT32 codecs)
if ((codecs & FREERDP_CODEC_INTERLEAVED) && !(encoder->codecs & FREERDP_CODEC_INTERLEAVED))
{
WLog_DBG(TAG, "initializing interleaved bitmap encoder");
status = shadow_encoder_init_interleaved(encoder);
if (status < 0)
@ -433,6 +439,7 @@ int shadow_encoder_prepare(rdpShadowEncoder* encoder, UINT32 codecs)
if ((codecs & (FREERDP_CODEC_AVC420 | FREERDP_CODEC_AVC444)) &&
!(encoder->codecs & (FREERDP_CODEC_AVC420 | FREERDP_CODEC_AVC444)))
{
WLog_DBG(TAG, "initializing H.264 encoder");
status = shadow_encoder_init_h264(encoder);
if (status < 0)