It sends a full update of the screen, in high quality JPEG format, after a
programmable idle time.
This is disabled by default. Quality can be configured and be truly lossless.
---
Hi,
resubmitting against latest trunk. Now you can apply and push.
common/rfb/ServerCore.cxx | 8 ++++++++
common/rfb/ServerCore.h | 3 ++-
common/rfb/VNCSConnectionST.cxx | 37 ++++++++++++++++++++++++++++++++++++-
common/rfb/VNCSConnectionST.h | 3 +++
unix/xserver/hw/vnc/Xvnc.man | 16 ++++++++++++++++
5 files changed, 65 insertions(+), 2 deletions(-)
diff --git a/common/rfb/ServerCore.cxx b/common/rfb/ServerCore.cxx
index ae2fd24..f44a9ca 100644
--- a/common/rfb/ServerCore.cxx
+++ b/common/rfb/ServerCore.cxx
@@ -93,4 +93,12 @@ rfb::BoolParameter rfb::Server::queryConnect
("QueryConnect",
"Prompt the local user to accept or reject incoming connections.",
false);
+rfb::IntParameter rfb::Server::automaticRefreshDelay
+("AutomaticRefreshDelay",
+ "Delay (in milliseconds) of inactivity after which to refresh framebuffer. 0
disables.",
+ 0);
+rfb::IntParameter rfb::Server::automaticRefreshQuality
+("AutomaticRefreshQuality",
+ "JPEG Quality (0-9) for automatic refresh. Special value -1 uses
mathematically lossless compression.",
+ 9);
diff --git a/common/rfb/ServerCore.h b/common/rfb/ServerCore.h
index e12a8bc..2f93886 100644
--- a/common/rfb/ServerCore.h
+++ b/common/rfb/ServerCore.h
@@ -38,6 +38,8 @@ namespace rfb {
static IntParameter maxIdleTime;
static IntParameter clientWaitTimeMillis;
static IntParameter compareFB;
+ static IntParameter automaticRefreshDelay;
+ static IntParameter automaticRefreshQuality;
static BoolParameter protocol3_3;
static BoolParameter alwaysShared;
static BoolParameter neverShared;
@@ -47,7 +49,6 @@ namespace rfb {
static BoolParameter acceptCutText;
static BoolParameter sendCutText;
static BoolParameter queryConnect;
-
};
};
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index 1ecd78c..a5b8013 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -74,7 +74,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_,
network::Socket *s,
drawRenderedCursor(false), removeRenderedCursor(false),
continuousUpdates(false),
updateTimer(this), pointerEventTime(0),
- accessRights(AccessDefault), startTime(time(0))
+ accessRights(AccessDefault), startTime(time(0)), refreshTimer(this)
{
setStreams(&sock->inStream(), &sock->outStream());
peerEndpoint.buf = sock->getPeerEndpoint();
@@ -758,6 +758,9 @@ bool VNCSConnectionST::handleTimeout(Timer* t)
writeFramebufferUpdate();
else if (t == &congestionTimer)
updateCongestion();
+ else if (t == &refreshTimer) {
+ automaticLosslessRefresh();
+ }
} catch (rdr::Exception& e) {
close(e.str());
}
@@ -971,6 +974,7 @@ void VNCSConnectionST::writeFramebufferUpdate()
// bit if things are congested.
if (isCongested()) {
updateTimer.start(50);
+ refreshTimer.stop();
return;
}
@@ -1070,6 +1074,7 @@ void VNCSConnectionST::writeFramebufferUpdate()
}
if (!ui.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) {
+ refreshTimer.stop();
// Compute the number of rectangles. Tight encoder makes the things more
// complicated as compared to the original VNC4.
writer()->setupCurrentEncoder();
@@ -1110,6 +1115,9 @@ void VNCSConnectionST::writeFramebufferUpdate()
writeRTTPing();
requested.clear();
+
+ if (rfb::Server::automaticRefreshDelay > 0)
+ refreshTimer.start(rfb::Server::automaticRefreshDelay);
}
out:
@@ -1238,3 +1246,30 @@ int VNCSConnectionST::getStatus()
return 4;
}
+void VNCSConnectionST::automaticLosslessRefresh(void)
+{
+ // Automatic lossless refresh using JPEG Q95, 1X chroma sampling
+ int q = cp.qualityLevel, fq = cp.fineQualityLevel;
+ JPEG_SUBSAMP subsampling = cp.subsampling;
+ bool noJpeg = cp.noJpeg;
+
+ if (Server::automaticRefreshQuality == -1) {
+ cp.noJpeg = true;
+ cp.qualityLevel = -1;
+ } else {
+ cp.qualityLevel = Server::automaticRefreshQuality;
+ cp.fineQualityLevel = 5 + cp.qualityLevel * 10;
+ cp.subsampling = SUBSAMP_NONE;
+ }
+
+ // Update all the screen (TODO: be smarter)
+ updates.add_changed(Rect(0, 0, cp.width, cp.height));
+ writeFramebufferUpdate();
+ refreshTimer.stop();
+
+ // Reset to previous compression settings
+ cp.qualityLevel = q;
+ cp.fineQualityLevel = fq;
+ cp.subsampling = subsampling;
+ cp.noJpeg = noJpeg;
+}
diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h
index 72dc59c..153409d 100644
--- a/common/rfb/VNCSConnectionST.h
+++ b/common/rfb/VNCSConnectionST.h
@@ -178,6 +178,8 @@ namespace rfb {
void setDesktopName(const char *name);
void setSocketTimeouts();
+ void automaticLosslessRefresh(void);
+
network::Socket* sock;
CharArray peerEndpoint;
@@ -207,6 +209,7 @@ namespace rfb {
Region cuRegion;
Timer updateTimer;
+ Timer refreshTimer;
std::set<rdr::U32> pressedKeys;
diff --git a/unix/xserver/hw/vnc/Xvnc.man b/unix/xserver/hw/vnc/Xvnc.man
index 356925d..fd19fd0 100644
--- a/unix/xserver/hw/vnc/Xvnc.man
+++ b/unix/xserver/hw/vnc/Xvnc.man
@@ -223,6 +223,22 @@ where
is a hexadecimal keysym. For example, to exchange the " and @ symbols you
would specify the following:
.IP "" 10
RemapKeys=0x22<>0x40
+.IP "" 7
+
+.TP
+.B \-AutomaticRefreshDelay \fIdelay
+Enable automatic lossless refresh and set the delay to
+.I delay
+milliseconds. If no updates have been sent to the client in the past
+.I delay
+milliseconds, Xvnc will update the screen with a visually lossless
+(JPEG quality 9) compression. Special value 0 disables automatic refresh (and
is the default).
+
+.TP
+.B \-AutomaticRefreshQuality \fIquality
+Override the quality of the automatic updates. Use 0-9 to select JPEG quality
level,
+use -1 as a special value to denote mathematically lossless compression. This
option has no effect unless
+.I \-AutomaticRefreshDelay is also specified.
.SH USAGE WITH INETD
By configuring the \fBinetd\fP(1) service appropriately, Xvnc can be launched
--
1.7.9.2
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
Tigervnc-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tigervnc-devel