summaryrefslogtreecommitdiffstats
path: root/libvncserver/rfbserver.c
diff options
context:
space:
mode:
authorChristian Beier <dontmind@freeshell.org>2012-04-25 12:55:03 +0200
committerChristian Beier <dontmind@freeshell.org>2012-04-25 12:55:03 +0200
commit413ca0dfef83b98f7b230e0596ac086d42eaad4e (patch)
treeb36ca82ac24402f3f0f5a7085f0561757e7b56f5 /libvncserver/rfbserver.c
parent2524573678fbdb195cbc9ba2f92e0f58c205ad10 (diff)
parent1df6bffd9e7ff5106ffb5f3bc1938a14ea1f72cf (diff)
downloadlibtdevnc-413ca0dfef83b98f7b230e0596ac086d42eaad4e.tar.gz
libtdevnc-413ca0dfef83b98f7b230e0596ac086d42eaad4e.zip
Merge branch 'turbovnc'
Conflicts, resolved manually: AUTHORS
Diffstat (limited to 'libvncserver/rfbserver.c')
-rw-r--r--libvncserver/rfbserver.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c
index 23c4d77..e18f31d 100644
--- a/libvncserver/rfbserver.c
+++ b/libvncserver/rfbserver.c
@@ -3,6 +3,7 @@
*/
/*
+ * Copyright (C) 2011-2012 D. R. Commander
* Copyright (C) 2005 Rohit Kumar, Johannes E. Schindelin
* Copyright (C) 2002 RealVNC Ltd.
* OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk@incompleteness.net>.
@@ -86,6 +87,21 @@ static int compat_mkdir(const char *path, int mode)
#define mkdir compat_mkdir
#endif
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+/*
+ * Map of quality levels to provide compatibility with TightVNC/TigerVNC
+ * clients. This emulates the behavior of the TigerVNC Server.
+ */
+
+static const int tight2turbo_qual[10] = {
+ 15, 29, 41, 42, 62, 77, 79, 86, 92, 100
+};
+
+static const int tight2turbo_subsamp[10] = {
+ 1, 1, 1, 2, 2, 2, 0, 0, 0, 0
+};
+#endif
+
static void rfbProcessClientProtocolVersion(rfbClientPtr cl);
static void rfbProcessClientNormalMessage(rfbClientPtr cl);
static void rfbProcessClientInitMessage(rfbClientPtr cl);
@@ -383,6 +399,7 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen,
cl->tightCompressLevel = TIGHT_DEFAULT_COMPRESSION;
#endif
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+ cl->turboSubsampLevel = TURBO_DEFAULT_SUBSAMP;
{
int i;
for (i = 0; i < 4; i++)
@@ -1963,6 +1980,16 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
cl->enableSupportedMessages = FALSE;
cl->enableSupportedEncodings = FALSE;
cl->enableServerIdentity = FALSE;
+#if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
+ cl->tightQualityLevel = -1;
+#if defined(LIBVNCSERVER_HAVE_LIBJPEG) || defined(LIBVNCSERVER_HAVE_LIBPNG)
+ cl->tightCompressLevel = TIGHT_DEFAULT_COMPRESSION;
+#endif
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+ cl->turboSubsampLevel = TURBO_DEFAULT_SUBSAMP;
+ cl->turboQualityLevel = -1;
+#endif
+#endif
for (i = 0; i < msg.se.nEncodings; i++) {
@@ -2097,6 +2124,22 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
cl->tightQualityLevel = enc & 0x0F;
rfbLog("Using image quality level %d for client %s\n",
cl->tightQualityLevel, cl->host);
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+ cl->turboQualityLevel = tight2turbo_qual[enc & 0x0F];
+ cl->turboSubsampLevel = tight2turbo_subsamp[enc & 0x0F];
+ rfbLog("Using JPEG subsampling %d, Q%d for client %s\n",
+ cl->turboSubsampLevel, cl->turboQualityLevel, cl->host);
+ } else if ( enc >= (uint32_t)rfbEncodingFineQualityLevel0 + 1 &&
+ enc <= (uint32_t)rfbEncodingFineQualityLevel100 ) {
+ cl->turboQualityLevel = enc & 0xFF;
+ rfbLog("Using fine quality level %d for client %s\n",
+ cl->turboQualityLevel, cl->host);
+ } else if ( enc >= (uint32_t)rfbEncodingSubsamp1X &&
+ enc <= (uint32_t)rfbEncodingSubsampGray ) {
+ cl->turboSubsampLevel = enc & 0xFF;
+ rfbLog("Using subsampling level %d for client %s\n",
+ cl->turboSubsampLevel, cl->host);
+#endif
} else
#endif
{