示例#1
0
文件: rfx.c 项目: 10084462/FreeRDP
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);
}
示例#2
0
文件: rfx.c 项目: C4rt/FreeRDP
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;
}
示例#3
0
文件: core.c 项目: bmiklautz/FreeRDS
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;
}
示例#4
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;
}
示例#5
0
文件: core.c 项目: vworkspace/FreeRDS
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;
}
示例#6
0
/**
 * 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;
}