I'm really sorry for the mess, I had assumed that trunk hadn't moved.
My patches don't properly on top of current trunk - please review and let me
know if they're OK to you, if they are I'll send the latest version.

On Fri,  2 Mar 2012 10:32:00 +0100
Arthur Huillet <arthur.huil...@free.fr> wrote:

> The server now only sends updates for those regions that were encoded with
> lossy JPEG. ---
>  common/rfb/SMsgWriter.cxx       |   10 ++++++++++
>  common/rfb/SMsgWriter.h         |    3 +++
>  common/rfb/TightEncoder.h       |    4 ++++
>  common/rfb/VNCSConnectionST.cxx |   21 ++++++++++++++++++---
>  common/rfb/tightEncode.h        |    5 +++++
>  5 files changed, 40 insertions(+), 3 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 2aa9dd1..bc50e0c 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:
> @@ -1258,10 +1260,23 @@ void VNCSConnectionST::automaticLosslessRefresh(void)
>      cp.subsampling = SUBSAMP_NONE;
>    }
>  
> -  // Update all the screen (TODO: be smarter)
> -  updates.add_changed(Rect(0, 0, cp.width, cp.height));
> +  // 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);
> +    }
> +  }
> +
>    writeFramebufferUpdate();
>    refreshTimer.stop();
> +  lossy_tracker->clear();
>  
>    // Reset to previous compression settings
>    cp.qualityLevel = q;
> 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
> 


-- 
Greetings, 
A. Huillet

------------------------------------------------------------------------------
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

Reply via email to