void rfx_compose_message(RFX_CONTEXT* context, wStream* s, const RFX_RECT* rects, int numRects, BYTE* data, int width, int height, int scanline) { RFX_MESSAGE* message; message = rfx_encode_message(context, rects, numRects, data, width, height, scanline); rfx_write_message(context, s, message); rfx_message_free(context, message); }
BOOL rfx_compose_message(RFX_CONTEXT* context, wStream* s, const RFX_RECT* rects, int numRects, BYTE* data, int width, int height, int scanline) { RFX_MESSAGE* message; BOOL ret = TRUE; if (!(message = rfx_encode_message(context, rects, numRects, data, width, height, scanline))) return FALSE; ret = rfx_write_message(context, s, message); message->freeRects = TRUE; rfx_message_free(context, message); return ret; }
int freerds_send_surface_bits(rdsConnection* connection, int bpp, RDS_MSG_PAINT_RECT* msg) { int i; BYTE* data; wStream* s; int scanline; int numMessages; int bytesPerPixel; SURFACE_BITS_COMMAND cmd; rdpUpdate* update = ((rdpContext*) connection)->update; if (!msg->framebuffer->fbAttached) return 0; if ((bpp == 24) || (bpp == 32)) { bytesPerPixel = 4; } else { printf("%s: unsupported bpp: %d\n", __FUNCTION__, bpp); return -1; } if (msg->fbSegmentId) { bpp = msg->framebuffer->fbBitsPerPixel; data = msg->framebuffer->fbSharedMemory; scanline = msg->framebuffer->fbScanline; } else { data = msg->bitmapData; scanline = bytesPerPixel * msg->nWidth; } //printf("%s: bpp: %d x: %d y: %d width: %d height: %d\n", __FUNCTION__, // bpp, msg->nLeftRect, msg->nTopRect, msg->nWidth, msg->nHeight); if (connection->settings->RemoteFxCodec) { RFX_RECT rect; RFX_MESSAGE* messages; s = connection->encoder->rfx_s; rect.x = msg->nLeftRect; rect.y = msg->nTopRect; rect.width = msg->nWidth; rect.height = msg->nHeight; messages = rfx_encode_messages(connection->encoder->rfx_context, &rect, 1, data, msg->nWidth, msg->nHeight, scanline, &numMessages, connection->settings->MultifragMaxRequestSize); cmd.codecID = connection->settings->RemoteFxCodecId; cmd.destLeft = msg->nLeftRect; cmd.destTop = msg->nTopRect; cmd.destRight = msg->nLeftRect + msg->nWidth; cmd.destBottom = msg->nTopRect + msg->nHeight; cmd.bpp = 32; cmd.width = msg->nWidth; cmd.height = msg->nHeight; for (i = 0; i < numMessages; i++) { Stream_SetPosition(s, 0); rfx_write_message(connection->encoder->rfx_context, s, &messages[i]); rfx_message_free(connection->encoder->rfx_context, &messages[i]); cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); IFCALL(update->SurfaceBits, update->context, &cmd); } free(messages); return 0; } else if (connection->settings->NSCodec) { NSC_MESSAGE* messages; s = connection->encoder->nsc_s; messages = nsc_encode_messages(connection->encoder->nsc_context, data, msg->nLeftRect, msg->nTopRect, msg->nWidth, msg->nHeight, scanline, &numMessages, connection->settings->MultifragMaxRequestSize); cmd.bpp = 32; cmd.codecID = connection->settings->NSCodecId; for (i = 0; i < numMessages; i++) { Stream_SetPosition(s, 0); nsc_write_message(connection->encoder->nsc_context, s, &messages[i]); nsc_message_free(connection->encoder->nsc_context, &messages[i]); cmd.destLeft = messages[i].x; cmd.destTop = messages[i].y; cmd.destRight = messages[i].x + messages[i].width; cmd.destBottom = messages[i].y + messages[i].height; cmd.width = messages[i].width; cmd.height = messages[i].height; cmd.bitmapDataLength = Stream_GetPosition(s); cmd.bitmapData = Stream_Buffer(s); IFCALL(update->SurfaceBits, update->context, &cmd); } free(messages); return 0; } else { printf("%s: no codecs available!\n", __FUNCTION__); return -1; } return 0; }
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; }