xfreerdp-server: optimize screen region encoding
This commit is contained in:
parent
cfd54a4e38
commit
5ee606cf10
@ -249,7 +249,7 @@ xfInfo* xf_info_init()
|
|||||||
|
|
||||||
xf_xshm_init(xfi);
|
xf_xshm_init(xfi);
|
||||||
|
|
||||||
xfi->bytesPerPixel = (xfi->use_xshm) ? 4 : 3;
|
xfi->bytesPerPixel = 4;
|
||||||
|
|
||||||
freerdp_kbd_init(xfi->display, 0);
|
freerdp_kbd_init(xfi->display, 0);
|
||||||
|
|
||||||
@ -264,10 +264,7 @@ void xf_peer_context_new(freerdp_peer* client, xfPeerContext* context)
|
|||||||
context->rfx_context->width = context->info->width;
|
context->rfx_context->width = context->info->width;
|
||||||
context->rfx_context->height = context->info->height;
|
context->rfx_context->height = context->info->height;
|
||||||
|
|
||||||
if (context->info->use_xshm)
|
|
||||||
rfx_context_set_pixel_format(context->rfx_context, RFX_PIXEL_FORMAT_BGRA);
|
rfx_context_set_pixel_format(context->rfx_context, RFX_PIXEL_FORMAT_BGRA);
|
||||||
else
|
|
||||||
rfx_context_set_pixel_format(context->rfx_context, RFX_PIXEL_FORMAT_RGB);
|
|
||||||
|
|
||||||
context->s = stream_new(65536);
|
context->s = stream_new(65536);
|
||||||
}
|
}
|
||||||
@ -308,11 +305,28 @@ STREAM* xf_peer_stream_init(xfPeerContext* context)
|
|||||||
return context->s;
|
return context->s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xf_xdamage_subtract_region(xfPeerContext* xfp, int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
XRectangle region;
|
||||||
|
xfInfo* xfi = xfp->info;
|
||||||
|
|
||||||
|
region.x = x;
|
||||||
|
region.y = y;
|
||||||
|
region.width = width;
|
||||||
|
region.height = height;
|
||||||
|
|
||||||
|
#ifdef WITH_XFIXES
|
||||||
|
pthread_mutex_lock(&(xfp->mutex));
|
||||||
|
XFixesSetRegion(xfi->display, xfi->xdamage_region, ®ion, 1);
|
||||||
|
XDamageSubtract(xfi->display, xfi->xdamage, xfi->xdamage_region, None);
|
||||||
|
pthread_mutex_unlock(&(xfp->mutex));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void* xf_monitor_graphics(void* param)
|
void* xf_monitor_graphics(void* param)
|
||||||
{
|
{
|
||||||
xfInfo* xfi;
|
xfInfo* xfi;
|
||||||
XEvent xevent;
|
XEvent xevent;
|
||||||
XRectangle region;
|
|
||||||
xfPeerContext* xfp;
|
xfPeerContext* xfp;
|
||||||
freerdp_peer* client;
|
freerdp_peer* client;
|
||||||
int pending_events = 0;
|
int pending_events = 0;
|
||||||
@ -350,17 +364,7 @@ void* xf_monitor_graphics(void* param)
|
|||||||
width = notify->area.width;
|
width = notify->area.width;
|
||||||
height = notify->area.height;
|
height = notify->area.height;
|
||||||
|
|
||||||
region.x = x;
|
xf_xdamage_subtract_region(xfp, x, y, width, height);
|
||||||
region.y = y;
|
|
||||||
region.width = width;
|
|
||||||
region.height = height;
|
|
||||||
|
|
||||||
#ifdef WITH_XFIXES
|
|
||||||
pthread_mutex_lock(&(xfp->mutex));
|
|
||||||
XFixesSetRegion(xfi->display, xfi->xdamage_region, ®ion, 1);
|
|
||||||
XDamageSubtract(xfi->display, xfi->xdamage, xfi->xdamage_region, None);
|
|
||||||
pthread_mutex_unlock(&(xfp->mutex));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
event_region = xf_event_region_new(x, y, width, height);
|
event_region = xf_event_region_new(x, y, width, height);
|
||||||
xf_event_push(xfp->event_queue, (xfEvent*) event_region);
|
xf_event_push(xfp->event_queue, (xfEvent*) event_region);
|
||||||
@ -476,17 +480,17 @@ void xf_peer_rfx_update(freerdp_peer* client, int x, int y, int width, int heigh
|
|||||||
|
|
||||||
s = xf_peer_stream_init(xfp);
|
s = xf_peer_stream_init(xfp);
|
||||||
|
|
||||||
image = xf_snapshot(xfp, x, y, width, height);
|
|
||||||
|
|
||||||
if (xfi->use_xshm)
|
if (xfi->use_xshm)
|
||||||
{
|
{
|
||||||
rect.x = 0;
|
rect.x = x;
|
||||||
rect.y = 0;
|
rect.y = y;
|
||||||
rect.width = width;
|
rect.width = width;
|
||||||
rect.height = height;
|
rect.height = height;
|
||||||
|
|
||||||
|
image = xf_snapshot(xfp, x, y, width, height);
|
||||||
|
|
||||||
rfx_compose_message(xfp->rfx_context, s, &rect, 1,
|
rfx_compose_message(xfp->rfx_context, s, &rect, 1,
|
||||||
(uint8*) image->data, width, height, image->bytes_per_line);
|
(uint8*) image->data, xfi->width, xfi->height, image->bytes_per_line);
|
||||||
|
|
||||||
cmd->destLeft = x;
|
cmd->destLeft = x;
|
||||||
cmd->destTop = y;
|
cmd->destTop = y;
|
||||||
@ -500,19 +504,18 @@ void xf_peer_rfx_update(freerdp_peer* client, int x, int y, int width, int heigh
|
|||||||
rect.width = width;
|
rect.width = width;
|
||||||
rect.height = height;
|
rect.height = height;
|
||||||
|
|
||||||
freerdp_image_convert((uint8*) image->data, xfp->capture_buffer,
|
image = xf_snapshot(xfp, x, y, width, height);
|
||||||
width, height, 32, 24, xfi->clrconv);
|
|
||||||
|
|
||||||
rfx_compose_message(xfp->rfx_context, s, &rect, 1,
|
rfx_compose_message(xfp->rfx_context, s, &rect, 1,
|
||||||
xfp->capture_buffer, width, height, width * xfi->bytesPerPixel);
|
(uint8*) image->data, width, height, width * xfi->bytesPerPixel);
|
||||||
|
|
||||||
cmd->destLeft = x;
|
cmd->destLeft = x;
|
||||||
cmd->destTop = y;
|
cmd->destTop = y;
|
||||||
cmd->destRight = x + width;
|
cmd->destRight = x + width;
|
||||||
cmd->destBottom = y + height;
|
cmd->destBottom = y + height;
|
||||||
}
|
|
||||||
|
|
||||||
XDestroyImage(image);
|
XDestroyImage(image);
|
||||||
|
}
|
||||||
|
|
||||||
cmd->bpp = 32;
|
cmd->bpp = 32;
|
||||||
cmd->codecID = client->settings->rfx_codec_id;
|
cmd->codecID = client->settings->rfx_codec_id;
|
||||||
|
Loading…
Reference in New Issue
Block a user