Hi. In VNCSConnectionST::automaticLosslessRefresh, there seems to be some
indentation only changes? Also, from my point of view, I think it's best
if you send a patch against latest trunk, rather than against previous
patches.
Regards,
Peter
On Thu, 1 Mar 2012, Arthur Huillet wrote:
The server now only sends updates for those regions that were encoded with
lossy JPEG.
---
Hello,
this is the second iteration of automatic lossless refresh. It applies
*on top* of the previous patch and adds smart updates by tracking which of the
updates were done in a lossy manner (JPEG).
common/rfb/SMsgWriter.cxx | 10 +++++++
common/rfb/SMsgWriter.h | 3 ++
common/rfb/TightEncoder.h | 4 +++
common/rfb/VNCSConnectionST.cxx | 61 ++++++++++++++++++++++++---------------
common/rfb/tightEncode.h | 5 ++++
5 files changed, 60 insertions(+), 23 deletions(-)
diff --git a/common/rfb/SMsgWriter.cxx b/common/rfb/SMsgWriter.cxx
index f47f3ee..b53c03b 100644
--- a/common/rfb/SMsgWriter.cxx
+++ b/common/rfb/SMsgWriter.cxx
@@ -25,6 +25,7 @@
#include <rfb/UpdateTracker.h>
#include <rfb/SMsgWriter.h>
#include <rfb/LogWriter.h>
+#include <rfb/TightEncoder.h>
using namespace rfb;
@@ -214,3 +215,12 @@ int SMsgWriter::bpp()
{
return cp->pf().bpp;
}
+
+SimpleUpdateTracker *SMsgWriter::getLossyRegions()
+{
+ if (cp->currentEncoding() != encodingTight)
+ return NULL;
+
+ TightEncoder *e = dynamic_cast<TightEncoder *>(encoders[encodingTight]);
+ return &(e->lossy_tracker);
+}
diff --git a/common/rfb/SMsgWriter.h b/common/rfb/SMsgWriter.h
index 3933b38..4ecc998 100644
--- a/common/rfb/SMsgWriter.h
+++ b/common/rfb/SMsgWriter.h
@@ -40,6 +40,7 @@ namespace rfb {
class ColourMap;
class Region;
class UpdateInfo;
+ class SimpleUpdateTracker;
class WriteSetCursorCallback {
public:
@@ -171,6 +172,8 @@ namespace rfb {
int getBytesSent(int encoding) { return bytesSent[encoding]; }
rdr::U64 getRawBytesEquivalent() { return rawBytesEquivalent; }
+ SimpleUpdateTracker *getLossyRegions();
+
int imageBufIdealSize;
protected:
diff --git a/common/rfb/TightEncoder.h b/common/rfb/TightEncoder.h
index 10ca761..62dccb3 100644
--- a/common/rfb/TightEncoder.h
+++ b/common/rfb/TightEncoder.h
@@ -23,6 +23,7 @@
#include <rdr/ZlibOutStream.h>
#include <rfb/TransImageGetter.h>
#include <rfb/Encoder.h>
+#include <rfb/UpdateTracker.h>
// FIXME: Check if specifying extern "C" is really necessary.
#include <stdio.h>
@@ -85,6 +86,8 @@ namespace rfb {
virtual bool writeRect(const Rect& r, TransImageGetter* ig, Rect* actual);
virtual ~TightEncoder();
+ SimpleUpdateTracker lossy_tracker;
+
private:
TightEncoder(SMsgWriter* writer);
bool checkSolidTile(Rect& r, rdr::U32* colorPtr, bool needSameColor);
@@ -155,6 +158,7 @@ namespace rfb {
const TIGHT_CONF* pconf;
int jpegQuality;
JPEG_SUBSAMP jpegSubsampling;
+
};
}
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index 11a6ced..096fad5 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -36,6 +36,7 @@
#include <rfb/fenceTypes.h>
#include <rfb/ServerCore.h>
#include <rfb/ComparingUpdateTracker.h>
+#include <rfb/UpdateTracker.h>
#include <rfb/KeyRemapper.h>
#define XK_MISCELLANY
#define XK_XKB_KEYS
@@ -1112,8 +1113,9 @@ void VNCSConnectionST::writeFramebufferUpdate()
requested.clear();
- if (rfb::Server::automaticRefreshDelay > 0)
+ if (rfb::Server::automaticRefreshDelay > 0 && cp.currentEncoding() ==
encodingTight) {
refreshTimer.start(rfb::Server::automaticRefreshDelay);
+ }
}
out:
@@ -1244,28 +1246,41 @@ int VNCSConnectionST::getStatus()
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 >= 10) {
- cp.noJpeg = true;
- cp.qualityLevel = -1;
- } else {
- cp.qualityLevel = Server::automaticRefreshQuality;
- cp.fineQualityLevel = 5 + cp.qualityLevel * 10;
- cp.subsampling = SUBSAMP_NONE;
- }
+ // 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 >= 10) {
+ 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();
+ // Update the regions which had been sent with lossy compression
+ SimpleUpdateTracker *lossy_tracker = writer()->getLossyRegions();
+
+ UpdateInfo ui;
+ lossy_tracker->getUpdateInfo(&ui, Region(Rect(0, 0, 10000, 10000)));
+ if (!ui.is_empty()) {
+ std::vector<Rect> rects;
+ std::vector<Rect>::const_iterator i;
+ ui.changed.get_rects(&rects);
+ for (i = rects.begin(); i != rects.end(); i++) {
+ updates.add_changed(*i);
+ }
+ }
- // Reset to previous compression settings
- cp.qualityLevel = q;
- cp.fineQualityLevel = fq;
- cp.subsampling = subsampling;
- cp.noJpeg = noJpeg;
+ writeFramebufferUpdate();
+ refreshTimer.stop();
+ lossy_tracker->clear();
+
+ // Reset to previous compression settings
+ cp.qualityLevel = q;
+ cp.fineQualityLevel = fq;
+ cp.subsampling = subsampling;
+ cp.noJpeg = noJpeg;
}
diff --git a/common/rfb/tightEncode.h b/common/rfb/tightEncode.h
index 446d45e..5c46879 100644
--- a/common/rfb/tightEncode.h
+++ b/common/rfb/tightEncode.h
@@ -248,23 +248,28 @@ void TIGHT_ENCODE (const Rect& r, rdr::OutStream *os,
bool forceSolid)
#if (BPP != 8)
if (jpegQuality != -1) {
encodeJpegRect(r, os);
+ lossy_tracker.add_changed(Region(r));
break;
}
#endif
ENCODE_FULLCOLOR_RECT(pixels, r, os);
+ lossy_tracker.subtract(Region(r));
break;
case 1:
// Solid rectangle
ENCODE_SOLID_RECT(pixels, os);
+ lossy_tracker.subtract(Region(r));
break;
case 2:
// Two-color rectangle
ENCODE_MONO_RECT(pixels, r, os);
+ lossy_tracker.subtract(Region(r));
break;
#if (BPP != 8)
default:
// Up to 256 different colors
ENCODE_INDEXED_RECT(pixels, r, os);
+ lossy_tracker.subtract(Region(r));
#endif
}
}
--
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
Tigervnc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-devel
---
Peter Åstrand ThinLinc Chief Developer
Cendio AB http://www.cendio.com
Wallenbergs gata 4
583 30 Linköping Phone: +46-13-21 46 00
------------------------------------------------------------------------------
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
Tigervnc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-devel