libfreerdp-core: implement frame acknowledge.
authorVic Lee <llyzs@163.com>
Fri, 11 May 2012 07:34:51 +0000 (15:34 +0800)
committerVic Lee <llyzs@163.com>
Fri, 11 May 2012 07:34:51 +0000 (15:34 +0800)
include/freerdp/settings.h
libfreerdp-core/capabilities.c
libfreerdp-core/rdp.h
libfreerdp-core/settings.c
libfreerdp-core/surface.c
libfreerdp-utils/args.c

index 2426d3a..1172e78 100644 (file)
@@ -391,7 +391,7 @@ struct rdp_settings
        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 */
index 001b38f..ca7a595 100644 (file)
@@ -1628,7 +1628,7 @@ void rdp_write_frame_acknowledge_capability_set(STREAM* s, rdpSettings* settings
 
        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);
 }
@@ -2068,7 +2068,7 @@ void rdp_write_confirm_active(STREAM* s, rdpSettings* settings)
 
        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);
index 103e9fa..16d7794 100644 (file)
 #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
index 306f86d..7ed68d8 100644 (file)
@@ -171,6 +171,8 @@ rdpSettings* settings_new(void* instance)
                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;
index a398c85..c765182 100644 (file)
@@ -46,6 +46,15 @@ static int update_recv_surfcmd_surface_bits(rdpUpdate* update, STREAM* s)
        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;
@@ -55,6 +64,11 @@ static int update_recv_surfcmd_frame_marker(rdpUpdate* update, STREAM* s)
 
        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;
 }
 
index ed922f2..77baebe 100644 (file)
@@ -89,6 +89,7 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv,
                                "  --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"
@@ -352,7 +353,6 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv,
                        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;
                }
@@ -378,6 +378,16 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv,
                                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;