void test_nsc_encode(void) { int i; uint8* rgb_data; STREAM* enc_stream; NSC_CONTEXT* context; rgb_data = (uint8 *) malloc(64 * 64 * 3); for (i = 0; i < 64; i++) memcpy(rgb_data + i * 64 * 3, rgb_scanline_data, 64 * 3); context = nsc_context_new(); nsc_context_set_cpu_opt(context, CPU_SSE2); nsc_context_set_pixel_format(context, RDP_PIXEL_FORMAT_R8G8B8); enc_stream = stream_new(65536); stream_clear(enc_stream); for (i = 0; i < 30000; i++) { stream_set_pos(enc_stream, 0); nsc_compose_message(context, enc_stream, rgb_data, 64, 64, 64 * 3); } /*freerdp_hexdump(stream_get_head(enc_stream), stream_get_length(enc_stream));*/ nsc_process_message(context, 32, 64, 64, stream_get_head(enc_stream), stream_get_length(enc_stream)); /*freerdp_hexdump(context->bmpdata, 64 * 64 * 4);*/ stream_free(enc_stream); nsc_context_free(context); }
void test_nsc_encode(void) { int i; BYTE* rgb_data; wStream* enc_stream; NSC_CONTEXT* context; rgb_data = (BYTE *) malloc(64 * 64 * 3); for (i = 0; i < 64; i++) memcpy(rgb_data + i * 64 * 3, rgb_scanline_data, 64 * 3); context = nsc_context_new(); nsc_context_set_pixel_format(context, RDP_PIXEL_FORMAT_R8G8B8); enc_stream = stream_new(65536); stream_clear(enc_stream); for (i = 0; i < 30000; i++) { Stream_SetPosition(enc_stream, 0); nsc_compose_message(context, enc_stream, rgb_data, 64, 64, 64 * 3); } /*winpr_HexDump(Stream_Buffer(enc_stream), Stream_GetPosition(enc_stream));*/ nsc_process_message(context, 32, 64, 64, Stream_Buffer(enc_stream), Stream_GetPosition(enc_stream)); /*winpr_HexDump(context->bmpdata, 64 * 64 * 4);*/ stream_free(enc_stream); nsc_context_free(context); }
static void test_peer_draw_background(freerdp_peer* client) { int size; wStream* s; RFX_RECT rect; BYTE* rgb_data; rdpUpdate* update = client->update; SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command; testPeerContext* context = (testPeerContext*) client->context; if (!client->settings->RemoteFxCodec && !client->settings->NSCodec) return; s = test_peer_stream_init(context); rect.x = 0; rect.y = 0; rect.width = client->settings->DesktopWidth; rect.height = client->settings->DesktopHeight; size = rect.width * rect.height * 3; if (!(rgb_data = malloc(size))) return; memset(rgb_data, 0xA0, size); if (client->settings->RemoteFxCodec) { if (!rfx_compose_message(context->rfx_context, s, &rect, 1, rgb_data, rect.width, rect.height, rect.width * 3)) { goto out; } cmd->codecID = client->settings->RemoteFxCodecId; } else { nsc_compose_message(context->nsc_context, s, rgb_data, rect.width, rect.height, rect.width * 3); cmd->codecID = client->settings->NSCodecId; } cmd->destLeft = 0; cmd->destTop = 0; cmd->destRight = rect.width; cmd->destBottom = rect.height; cmd->bpp = 32; cmd->width = rect.width; cmd->height = rect.height; cmd->bitmapDataLength = Stream_GetPosition(s); cmd->bitmapData = Stream_Buffer(s); test_peer_begin_frame(client); update->SurfaceBits(update->context, cmd); test_peer_end_frame(client); out: free(rgb_data); }
static void test_peer_draw_background(freerdp_peer* client) { testPeerContext* context = (testPeerContext*) client->context; rdpUpdate* update = client->update; SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command; STREAM* s; RFX_RECT rect; uint8* rgb_data; int size; if (!client->settings->rfx_codec && !client->settings->ns_codec) return; test_peer_begin_frame(client); s = test_peer_stream_init(context); rect.x = 0; rect.y = 0; rect.width = client->settings->width; rect.height = client->settings->height; size = rect.width * rect.height * 3; rgb_data = xmalloc(size); memset(rgb_data, 0xA0, size); if (client->settings->rfx_codec) { rfx_compose_message(context->rfx_context, s, &rect, 1, rgb_data, rect.width, rect.height, rect.width * 3); cmd->codecID = client->settings->rfx_codec_id; } else { nsc_compose_message(context->nsc_context, s, rgb_data, rect.width, rect.height, rect.width * 3); cmd->codecID = client->settings->ns_codec_id; } cmd->destLeft = 0; cmd->destTop = 0; cmd->destRight = rect.width; cmd->destBottom = rect.height; cmd->bpp = 32; cmd->width = rect.width; cmd->height = rect.height; cmd->bitmapDataLength = stream_get_length(s); cmd->bitmapData = stream_get_head(s); update->SurfaceBits(update->context, cmd); xfree(rgb_data); test_peer_end_frame(client); }
static void test_peer_draw_icon(freerdp_peer* client, int x, int y) { wStream* s; RFX_RECT rect; rdpUpdate* update = client->update; SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command; testPeerContext* context = (testPeerContext*) client->context; if (client->update->dump_rfx) return; if (!context) return; if (context->icon_width < 1 || !context->activated) return; test_peer_begin_frame(client); rect.x = 0; rect.y = 0; rect.width = context->icon_width; rect.height = context->icon_height; 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->codecID = client->settings->RemoteFxCodecId; } else { nsc_compose_message(context->nsc_context, s, context->bg_data, rect.width, rect.height, rect.width * 3); cmd->codecID = client->settings->NSCodecId; } cmd->destLeft = context->icon_x; cmd->destTop = context->icon_y; cmd->destRight = context->icon_x + context->icon_width; cmd->destBottom = context->icon_y + context->icon_height; cmd->bpp = 32; cmd->width = context->icon_width; cmd->height = context->icon_height; cmd->bitmapDataLength = Stream_GetPosition(s); cmd->bitmapData = Stream_Buffer(s); update->SurfaceBits(update->context, cmd); } 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->codecID = client->settings->RemoteFxCodecId; } else { nsc_compose_message(context->nsc_context, s, context->icon_data, rect.width, rect.height, rect.width * 3); cmd->codecID = client->settings->NSCodecId; } cmd->destLeft = x; cmd->destTop = y; cmd->destRight = x + context->icon_width; cmd->destBottom = y + context->icon_height; cmd->bpp = 32; cmd->width = context->icon_width; cmd->height = context->icon_height; cmd->bitmapDataLength = Stream_GetPosition(s); cmd->bitmapData = Stream_Buffer(s); update->SurfaceBits(update->context, cmd); context->icon_x = x; context->icon_y = y; test_peer_end_frame(client); }
int shadow_client_send_surface_bits(rdpShadowClient* client, rdpShadowSurface* surface, int nXSrc, int nYSrc, int nWidth, int nHeight) { int i; BOOL first; BOOL last; wStream* s; int nSrcStep; BYTE* pSrcData; int numMessages; UINT32 frameId = 0; rdpUpdate* update; rdpContext* context; rdpSettings* settings; rdpShadowServer* server; rdpShadowEncoder* encoder; SURFACE_BITS_COMMAND cmd; context = (rdpContext*) client; update = context->update; settings = context->settings; server = client->server; encoder = client->encoder; pSrcData = surface->data; nSrcStep = surface->scanline; if (server->shareSubRect) { int subX, subY; int subWidth, subHeight; subX = server->subRect.left; subY = server->subRect.top; subWidth = server->subRect.right - server->subRect.left; subHeight = server->subRect.bottom - server->subRect.top; nXSrc -= subX; nYSrc -= subY; pSrcData = &pSrcData[(subY * nSrcStep) + (subX * 4)]; } if (encoder->frameAck) frameId = shadow_encoder_create_frame_id(encoder); if (settings->RemoteFxCodec) { RFX_RECT rect; RFX_MESSAGE* messages; RFX_RECT *messageRects = NULL; shadow_encoder_prepare(encoder, FREERDP_CODEC_REMOTEFX); s = encoder->bs; rect.x = nXSrc; rect.y = nYSrc; rect.width = nWidth; rect.height = nHeight; if (!(messages = rfx_encode_messages(encoder->rfx, &rect, 1, pSrcData, settings->DesktopWidth, settings->DesktopHeight, nSrcStep, &numMessages, settings->MultifragMaxRequestSize))) { return 0; } cmd.codecID = settings->RemoteFxCodecId; cmd.destLeft = 0; cmd.destTop = 0; cmd.destRight = settings->DesktopWidth; cmd.destBottom = settings->DesktopHeight; cmd.bpp = 32; cmd.width = settings->DesktopWidth; cmd.height = settings->DesktopHeight; cmd.skipCompression = TRUE; if (numMessages > 0) messageRects = messages[0].rects; for (i = 0; i < numMessages; i++) { Stream_SetPosition(s, 0); if (!rfx_write_message(encoder->rfx, s, &messages[i])) { while (i < numMessages) { rfx_message_free(encoder->rfx, &messages[i++]); } break; } rfx_message_free(encoder->rfx, &messages[i]); cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); first = (i == 0) ? TRUE : FALSE; last = ((i + 1) == numMessages) ? TRUE : FALSE; if (!encoder->frameAck) IFCALL(update->SurfaceBits, update->context, &cmd); else IFCALL(update->SurfaceFrameBits, update->context, &cmd, first, last, frameId); } free(messageRects); free(messages); } else if (settings->NSCodec) { shadow_encoder_prepare(encoder, FREERDP_CODEC_NSCODEC); s = encoder->bs; Stream_SetPosition(s, 0); pSrcData = &pSrcData[(nYSrc * nSrcStep) + (nXSrc * 4)]; nsc_compose_message(encoder->nsc, s, pSrcData, nWidth, nHeight, nSrcStep); cmd.bpp = 32; cmd.codecID = settings->NSCodecId; cmd.destLeft = nXSrc; cmd.destTop = nYSrc; cmd.destRight = cmd.destLeft + nWidth; cmd.destBottom = cmd.destTop + nHeight; cmd.width = nWidth; cmd.height = nHeight; cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); first = TRUE; last = TRUE; if (!encoder->frameAck) IFCALL(update->SurfaceBits, update->context, &cmd); else IFCALL(update->SurfaceFrameBits, update->context, &cmd, first, last, frameId); } return 1; }
int freerds_send_surface_bits(rdsConnection* connection, int bpp, RDS_MSG_PAINT_RECT* msg) { int i; BOOL first; BOOL last; int nXSrc; int nYSrc; int nWidth; int nHeight; wStream* s; int nSrcStep; BYTE* pSrcData; int numMessages; UINT32 frameId = 0; rdpUpdate* update; rdpContext* context; rdpSettings* settings; rdsEncoder* encoder; SURFACE_BITS_COMMAND cmd; WLog_VRB(TAG, "%s", __FUNCTION__); nXSrc = msg->nLeftRect; nYSrc = msg->nTopRect; nWidth = msg->nWidth; nHeight = msg->nHeight; context = (rdpContext*) connection; update = context->update; settings = connection->settings; encoder = connection->encoder; pSrcData = msg->framebuffer->fbSharedMemory; nSrcStep = msg->framebuffer->fbScanline; if (encoder->frameAck) frameId = (UINT32) freerds_encoder_create_frame_id(encoder); if (settings->RemoteFxCodec) { RFX_RECT rect; RFX_MESSAGE* messages; freerds_encoder_prepare(encoder, FREERDP_CODEC_REMOTEFX); s = encoder->bs; rect.x = nXSrc; rect.y = nYSrc; rect.width = nWidth; rect.height = nHeight; messages = rfx_encode_messages(encoder->rfx, &rect, 1, pSrcData, msg->framebuffer->fbWidth, msg->framebuffer->fbHeight, nSrcStep, &numMessages, settings->MultifragMaxRequestSize); cmd.codecID = settings->RemoteFxCodecId; cmd.destLeft = 0; cmd.destTop = 0; cmd.destRight = msg->framebuffer->fbWidth; cmd.destBottom = msg->framebuffer->fbHeight; cmd.bpp = 32; cmd.width = msg->framebuffer->fbWidth; cmd.height = msg->framebuffer->fbHeight; for (i = 0; i < numMessages; i++) { Stream_SetPosition(s, 0); rfx_write_message(encoder->rfx, s, &messages[i]); rfx_message_free(encoder->rfx, &messages[i]); cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); first = (i == 0) ? TRUE : FALSE; last = ((i + 1) == numMessages) ? TRUE : FALSE; if (!encoder->frameAck) IFCALL(update->SurfaceBits, update->context, &cmd); else IFCALL(update->SurfaceFrameBits, update->context, &cmd, first, last, frameId); } free(messages); } else if (settings->NSCodec) { freerds_encoder_prepare(encoder, FREERDP_CODEC_NSCODEC); s = encoder->bs; Stream_SetPosition(s, 0); pSrcData = &pSrcData[(nYSrc * nSrcStep) + (nXSrc * 4)]; nsc_compose_message(encoder->nsc, s, pSrcData, nWidth, nHeight, nSrcStep); cmd.bpp = 32; cmd.codecID = settings->NSCodecId; cmd.destLeft = nXSrc; cmd.destTop = nYSrc; cmd.destRight = cmd.destLeft + nWidth; cmd.destBottom = cmd.destTop + nHeight; cmd.width = nWidth; cmd.height = nHeight; cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); first = TRUE; last = TRUE; if (!encoder->frameAck) IFCALL(update->SurfaceBits, update->context, &cmd); else IFCALL(update->SurfaceFrameBits, update->context, &cmd, first, last, frameId); } return 1; }
/** * Function description * * @return TRUE on success */ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcData, int nSrcStep, int nXSrc, int nYSrc, int nWidth, int nHeight) { BOOL ret = TRUE; int i; BOOL first; BOOL last; wStream* s; int numMessages; UINT32 frameId = 0; rdpUpdate* update; rdpContext* context; rdpSettings* settings; rdpShadowServer* server; rdpShadowEncoder* encoder; SURFACE_BITS_COMMAND cmd; context = (rdpContext*) client; update = context->update; settings = context->settings; server = client->server; encoder = client->encoder; if (encoder->frameAck) frameId = shadow_encoder_create_frame_id(encoder); if (settings->RemoteFxCodec) { RFX_RECT rect; RFX_MESSAGE* messages; RFX_RECT *messageRects = NULL; if (shadow_encoder_prepare(encoder, FREERDP_CODEC_REMOTEFX) < 0) { WLog_ERR(TAG, "Failed to prepare encoder FREERDP_CODEC_REMOTEFX"); return FALSE; } s = encoder->bs; rect.x = nXSrc; rect.y = nYSrc; rect.width = nWidth; rect.height = nHeight; if (!(messages = rfx_encode_messages(encoder->rfx, &rect, 1, pSrcData, settings->DesktopWidth, settings->DesktopHeight, nSrcStep, &numMessages, settings->MultifragMaxRequestSize))) { WLog_ERR(TAG, "rfx_encode_messages failed"); return FALSE; } cmd.codecID = settings->RemoteFxCodecId; cmd.destLeft = 0; cmd.destTop = 0; cmd.destRight = settings->DesktopWidth; cmd.destBottom = settings->DesktopHeight; cmd.bpp = 32; cmd.width = settings->DesktopWidth; cmd.height = settings->DesktopHeight; cmd.skipCompression = TRUE; if (numMessages > 0) messageRects = messages[0].rects; for (i = 0; i < numMessages; i++) { Stream_SetPosition(s, 0); if (!rfx_write_message(encoder->rfx, s, &messages[i])) { while (i < numMessages) { rfx_message_free(encoder->rfx, &messages[i++]); } WLog_ERR(TAG, "rfx_write_message failed"); ret = FALSE; break; } rfx_message_free(encoder->rfx, &messages[i]); cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); first = (i == 0) ? TRUE : FALSE; last = ((i + 1) == numMessages) ? TRUE : FALSE; if (!encoder->frameAck) IFCALLRET(update->SurfaceBits, ret, update->context, &cmd); else IFCALLRET(update->SurfaceFrameBits, ret, update->context, &cmd, first, last, frameId); if (!ret) { WLog_ERR(TAG, "Send surface bits(RemoteFxCodec) failed"); break; } } free(messageRects); free(messages); } else if (settings->NSCodec) { if (shadow_encoder_prepare(encoder, FREERDP_CODEC_NSCODEC) < 0) { WLog_ERR(TAG, "Failed to prepare encoder FREERDP_CODEC_NSCODEC"); return FALSE; } s = encoder->bs; Stream_SetPosition(s, 0); pSrcData = &pSrcData[(nYSrc * nSrcStep) + (nXSrc * 4)]; nsc_compose_message(encoder->nsc, s, pSrcData, nWidth, nHeight, nSrcStep); cmd.bpp = 32; cmd.codecID = settings->NSCodecId; cmd.destLeft = nXSrc; cmd.destTop = nYSrc; cmd.destRight = cmd.destLeft + nWidth; cmd.destBottom = cmd.destTop + nHeight; cmd.width = nWidth; cmd.height = nHeight; cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); first = TRUE; last = TRUE; if (!encoder->frameAck) IFCALLRET(update->SurfaceBits, ret, update->context, &cmd); else IFCALLRET(update->SurfaceFrameBits, ret, update->context, &cmd, first, last, frameId); if (!ret) { WLog_ERR(TAG, "Send surface bits(NSCodec) failed"); } } return ret; }