ALIGN64 uint32 rfx_codec_id; /* 282 */
ALIGN64 uint32 ns_codec_id; /* 283 */
ALIGN64 uint32 rfx_codec_mode; /* 284 */
- ALIGN64 boolean frame_acknowledge; /* 285 */
+ ALIGN64 uint32 frame_acknowledge; /* 285 */
ALIGN64 uint64 paddingM[296 - 286]; /* 286 */
/* Recording */
header = rdp_capability_set_start(s);
- stream_write_uint32(s, 2); /* (4 bytes) */
+ stream_write_uint32(s, settings->frame_acknowledge); /* (4 bytes) */
rdp_capability_set_finish(s, header, CAPSET_TYPE_FRAME_ACKNOWLEDGE);
}
if (settings->received_caps[CAPSET_TYPE_FRAME_ACKNOWLEDGE])
{
- if (settings->frame_acknowledge)
+ if (settings->frame_acknowledge > 0)
{
numberCapabilities++;
rdp_write_frame_acknowledge_capability_set(s, settings);
#define DATA_PDU_TYPE_ARC_STATUS 0x32
#define DATA_PDU_TYPE_STATUS_INFO 0x36
#define DATA_PDU_TYPE_MONITOR_LAYOUT 0x37
+#define DATA_PDU_TYPE_FRAME_ACKNOWLEDGE 0x38
/* Stream Identifiers */
#define STREAM_UNDEFINED 0x00
settings->fastpath_input = true;
settings->fastpath_output = true;
+ settings->frame_acknowledge = 2;
+
settings->uniconv = freerdp_uniconv_new();
gethostname(settings->client_hostname, sizeof(settings->client_hostname) - 1);
settings->mouse_motion = true;
return 20 + cmd->bitmapDataLength;
}
+static void update_send_frame_acknowledge(rdpRdp* rdp, uint32 frameId)
+{
+ STREAM* s;
+
+ s = rdp_data_pdu_init(rdp);
+ stream_write_uint32(s, frameId);
+ rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FRAME_ACKNOWLEDGE, rdp->mcs->user_id);
+}
+
static int update_recv_surfcmd_frame_marker(rdpUpdate* update, STREAM* s)
{
SURFACE_FRAME_MARKER* marker = &update->surface_frame_marker;
IFCALL(update->SurfaceFrameMarker, update->context, marker);
+ if (update->context->rdp->settings->frame_acknowledge > 0 && marker->frameAction == SURFACECMD_FRAMEACTION_END)
+ {
+ update_send_frame_acknowledge(update->context->rdp, marker->frameId);
+ }
+
return 6;
}
" --plugin: load a virtual channel plugin\n"
" --rfx: enable RemoteFX\n"
" --rfx-mode: RemoteFX operational flags (v[ideo], i[mage]), default is video\n"
+ " --frame-ack: number of frames pending to be acknowledged, default is 2 (disable with 0)\n"
" --nsc: enable NSCodec (experimental)\n"
" --disable-wallpaper: disables wallpaper\n"
" --composition: enable desktop composition\n"
settings->rfx_codec = true;
settings->fastpath_output = true;
settings->color_depth = 32;
- settings->frame_acknowledge = false;
settings->performance_flags = PERF_FLAG_NONE;
settings->large_pointer = true;
}
return FREERDP_ARGS_PARSE_FAILURE;
}
}
+ else if (strcmp("--frame-ack", argv[index]) == 0)
+ {
+ index++;
+ if (index == argc)
+ {
+ printf("missing frame acknowledge number\n");
+ return FREERDP_ARGS_PARSE_FAILURE;
+ }
+ settings->frame_acknowledge = atoi(argv[index]);
+ }
else if (strcmp("--nsc", argv[index]) == 0)
{
settings->ns_codec = true;