Google Summer of Code 2010/VNC: Difference between revisions

From QEMU
Line 178: Line 178:
=== tight ===
=== tight ===


* full color '''work in progress (almost done)'''
http://git.iksaif.net/?p=qemu.git;a=shortlog;h=refs/heads/tight
* solid rectangles detections '''work in progress (delayed, need to finished full color first)'''
 
* solid color
* full color '''done'''
* solid rectangles detections '''work in progress'''
* solid color '''work in progress'''
* palette filter
* monochrome
* monochrome
* indexed rectangles
* gadrient filter
* jpeg
* jpeg
* palette filter
* gadrient filter

Revision as of 09:00, 8 May 2010

Summary

QEMU's built-in VNC server only supports the Hextile encoding. Hextile only uses tile-based compression. Other encodings are more popular such as Tight and ZRLE that use zlib-based compression. These encodings significantly reduce the bandwidth required by VNC.

Owner

Detailed Summary

QEMU's built-in VNC server only supports the Hextile encoding. Hextile only uses tile-based compression. Other encodings are more popular such as Tight and ZRLE that use zlib-based compression. These encodings significantly reduce the bandwidth required by VNC. This project would start by implementing support for Tight or ZRLE. Both encodings support a combination of tile-based compression and zlib-compression. Initially, one would implement zlib-compression only and compare the results to our Hextile implementation. Depending on progress, tile-based compression mechanisms (such as Tight's gradient algorithm) could be explored. At each stage, we expect that performance comparisons are done to determine the effectiveness of the additional algorithm. Additional compression mechanisms like Tight's JPEG encoding could also be evaluated.

Encodings

Feature Matrix

Software Raw CopyRect RRE CoRRE Hextile ZRLE ZYWRLE zlib tight zlibhex Ultra UltraZip
libvncclient y y y y y y y y y y y y
libvncserver y y y y y y y y y y y y
tigervnc y y y y? y y n n y n n n
ultravnc y y y y y y y y y y y y
tightvnc y y y y? y y n n y n n n
realvnc
qemu y y n n y n n y n n n n
gtk-vnc y y y n y y n n y n n n


RRE

RRE stands for rise-and-run-length encoding and as its name implies, it is essentially a two-dimensional analogue of run-length encoding. RRE-encoded rectangles arrive at the client in a form which can be rendered immediately and efficiently by the simplest of graphics engines. RRE is not appropriate for complex desktops, but can be useful in some situations.

CoRRE

Note: the CoRRE encoding is almost never useful - Hextile is a better encoding using the same ideas. CoRRE (Compact RRE) is a variant of RRE, where we guarantee that the largest rect- angle sent is no more than 255x255 pixels. A server which wants to send a rectangle larger than this simply splits it up and sends several smaller RFB rectangles.

ZRLE

ZRLE stands for Zlib1 Run-Length Encoding, and combines zlib compression, tiling, palettisation and run-length encoding. On the wire, the rectangle begins with a 4-byte length field, and is followed by that many bytes of zlib-compressed data. A single zlib “stream” object is used for a given RFB protocol connection, so that ZRLE rectangles must be encoded and decoded strictly in order.

Benchmarks

We'll need something to compare different encodings and how much bandwidth/cpu they use. For that we can probably use http://www.lesswatts.org/projects/bltk/ with Idle, Office and Dvd Player workloads.

Status

git tree

tight

http://git.iksaif.net/?p=qemu.git;a=shortlog;h=refs/heads/tight

  • full color done
  • solid rectangles detections work in progress
  • solid color work in progress
  • palette filter
  • monochrome
  • indexed rectangles
  • gadrient filter
  • jpeg