summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libxrdp/libxrdp.h20
-rw-r--r--libxrdp/xrdp_jpeg_compress.c61
-rw-r--r--xorg/server/module/Makefile2
-rw-r--r--xorg/server/module/rdpCapture.c101
-rw-r--r--xorg/server/module/rdpCapture.h24
-rw-r--r--xorg/server/readme.txt11
6 files changed, 216 insertions, 3 deletions
diff --git a/libxrdp/libxrdp.h b/libxrdp/libxrdp.h
index 70c8a124..993b412b 100644
--- a/libxrdp/libxrdp.h
+++ b/libxrdp/libxrdp.h
@@ -221,7 +221,7 @@ struct xrdp_orders_state
int com_blt_width; /* 2 */
int com_blt_height; /* 2 */
int com_blt_dstformat; /* 2 */
-
+
};
/* orders */
@@ -473,6 +473,24 @@ xrdp_jpeg_compress(void *handle, char* in_data, int width, int height,
struct stream* s, int bpp, int byte_limit,
int start_line, struct stream* temp_s,
int e, int quality);
+
+int APP_CC
+xrdp_codec_jpeg_compress(void *handle,
+ int format, /* input data format */
+ char *inp_data, /* input data */
+ int width, /* width of inp_data */
+ int height, /* height of inp_data */
+ int stride, /* inp_data stride, in bytes*/
+ int x, /* x loc in inp_data */
+ int y, /* y loc in inp_data */
+ int cx, /* width of area to compress */
+ int cy, /* height of area to compress */
+ int quality, /* higher numbers compress less */
+ char *out_data, /* dest for jpg image */
+ int *io_len /* length of out_data and on return */
+ /* len of compressed data */
+ );
+
void *APP_CC
xrdp_jpeg_init(void);
int APP_CC
diff --git a/libxrdp/xrdp_jpeg_compress.c b/libxrdp/xrdp_jpeg_compress.c
index a41bd1cf..1bb42b8c 100644
--- a/libxrdp/xrdp_jpeg_compress.c
+++ b/libxrdp/xrdp_jpeg_compress.c
@@ -98,6 +98,67 @@ xrdp_jpeg_compress(void *handle, char *in_data, int width, int height,
return height;
}
+/**
+ * Compress a rectangular area (aka inner rectangle) inside our
+ * frame buffer (inp_data)
+ *****************************************************************************/
+
+int APP_CC
+xrdp_codec_jpeg_compress(void *handle,
+ int format, /* input data format */
+ char *inp_data, /* input data */
+ int width, /* width of inp_data */
+ int height, /* height of inp_data */
+ int stride, /* inp_data stride, in bytes*/
+ int x, /* x loc in inp_data */
+ int y, /* y loc in inp_data */
+ int cx, /* width of area to compress */
+ int cy, /* height of area to compress */
+ int quality, /* higher numbers compress less */
+ char *out_data, /* dest for jpg image */
+ int *io_len /* length of out_data and on return */
+ /* len of compressed data */
+ )
+{
+ tjhandle tj_han;
+ int error;
+ int bpp;
+ char *src_ptr;
+
+ /*
+ * note: for now we assume that format is always XBGR and ignore format
+ */
+
+ if (handle == 0)
+ {
+ g_writeln("xrdp_codec_jpeg_compress: handle is nil");
+ return height;
+ }
+
+ tj_han = (tjhandle) handle;
+
+ /* get bytes per pixel */
+ bpp = stride / width;
+
+ /* start of inner rect in inp_data */
+ src_ptr = inp_data + (y * stride + x * bpp);
+
+ /* compress inner rect */
+ error = tjCompress(tj_han, /* opaque handle */
+ src_ptr, /* source buf */
+ cx, /* width of area to compress */
+ stride, /* pitch */
+ cy, /* height of area to compress */
+ TJPF_XBGR, /* pixel size */
+ out_data, /* dest buf */
+ io_len, /* inner_buf length & compressed_size */
+ TJSAMP_420, /* jpeg sub sample */
+ quality, /* jpeg quality */
+ 0 /* flags */
+ );
+ return height;
+}
+
/*****************************************************************************/
void *APP_CC
xrdp_jpeg_init(void)
diff --git a/xorg/server/module/Makefile b/xorg/server/module/Makefile
index d30b2ba9..8ddfb864 100644
--- a/xorg/server/module/Makefile
+++ b/xorg/server/module/Makefile
@@ -5,7 +5,7 @@ rdpPolyRectangle.o rdpPolyArc.o rdpFillPolygon.o rdpPolyFillRect.o \
rdpPolyFillArc.o rdpPolyText8.o rdpPolyText16.o rdpImageText8.o \
rdpImageText16.o rdpImageGlyphBlt.o rdpPolyGlyphBlt.o rdpPushPixels.o \
rdpCursor.o rdpMain.o rdpRandR.o rdpMisc.o rdpReg.o \
-rdpComposite.o rdpGlyphs.o rdpPixmap.o rdpInput.o rdpClientCon.o
+rdpComposite.o rdpGlyphs.o rdpPixmap.o rdpInput.o rdpClientCon.o rdpCapture.o
CFLAGS = -g -O2 -Wall -fPIC -I/usr/include/xorg -I/usr/include/pixman-1
diff --git a/xorg/server/module/rdpCapture.c b/xorg/server/module/rdpCapture.c
new file mode 100644
index 00000000..1ab6c4ec
--- /dev/null
+++ b/xorg/server/module/rdpCapture.c
@@ -0,0 +1,101 @@
+/**
+ * xrdp: A Remote Desktop Protocol server.
+ *
+ * Copyright (C) Laxmikant Rashinkar 2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Routines to copy regions from framebuffer to shared memory
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* this should be before all X11 .h files */
+#include <xorg-server.h>
+
+/* all driver need this */
+#include <xf86.h>
+#include <xf86_OSproc.h>
+
+#include "rdp.h"
+#include "rdpDraw.h"
+#include "rdpClientCon.h"
+
+#define LOG_LEVEL 1
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+/**
+ * Copy an array of rectangles from one memory area to another
+ *****************************************************************************/
+
+Bool rdpCapture(RegionPtr in_reg, RegionPtr out_reg,
+ void *src, int src_width, int src_height, int src_stride, int src_format,
+ void *dst, int dst_width, int dst_height, int dst_stride, int dst_format,
+ int mode)
+{
+ BoxRec rect;
+ char *src_rect;
+ char *dst_rect;
+ int num_regions;
+ int bpp;
+ int width;
+ int height;
+ int offset;
+ int bytes;
+ int i;
+ int j;
+
+ /*
+ * note: mode = 0: default, one is to one copy
+ * xxx_format = 0: default, 4 bytes per pixel
+ */
+
+ /* for now we only handle defaults */
+
+ /* number of rectangles to copy */
+ num_regions = REGION_NUM_RECTS(in_reg);
+
+ /* get bytes per pixel */
+ bpp = src_stride / src_width;
+
+ for (i = 0; i < num_regions; i++)
+ {
+ /* get rect to copy */
+ rect = REGION_RECTS(in_reg)[i];
+
+ /* get rect dimensions */
+ width = rect.x2 - rect.x1;
+ height = rect.y2 - rect.y1;
+
+ /* point to start of each rect in respective memory */
+ offset = rect.y1 * src_stride + rect.x1 * bpp;
+ src_rect = src + offset;
+ dst_rect = dst + offset;
+
+ /* bytes per line */
+ bytes = width * bpp;
+
+ /* copy one line at a time */
+ for (j = 0; j < height; j++)
+ {
+ memcpy(dst_rect, src_rect, bytes);
+ src_rect += src_stride;
+ dst_rect += src_stride;
+ }
+ }
+
+ return rdpRegionCopy(out_reg, in_reg);
+}
diff --git a/xorg/server/module/rdpCapture.h b/xorg/server/module/rdpCapture.h
new file mode 100644
index 00000000..87bf692b
--- /dev/null
+++ b/xorg/server/module/rdpCapture.h
@@ -0,0 +1,24 @@
+/**
+ * xrdp: A Remote Desktop Protocol server.
+ *
+ * Copyright (C) Laxmikant Rashinkar 2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Routines to copy regions from framebuffer to shared memory
+ */
+
+Bool rdpCapture(RegionPtr in_reg, RegionPtr out_reg,
+ void *src, int src_width, int src_height, int src_stride, int src_format,
+ void *dst, int dst_width, int dst_height, int dst_stride, int dst_format,
+ int mode)
diff --git a/xorg/server/readme.txt b/xorg/server/readme.txt
index dce66306..28bbc692 100644
--- a/xorg/server/readme.txt
+++ b/xorg/server/readme.txt
@@ -1,7 +1,16 @@
-Notes for building xrdpdev_drv.so and libxorgxrdp.so
+------------------------------------------------------
+ Notes for building xrdpdev_drv.so and libxorgxrdp.so
+------------------------------------------------------
+Pre-requisites:
+ o sudo apt-get install xserver-xorg-dev
+quick and easy way to build and run the driver
+ o cd xorg/server
+ o ./test-in-home.sh
+
+ o see /etc/X11/xrdp/xorg.conf to see how things are configured
to run it
create /etc/X11/xrdp