xpra icon
Bug tracker and wiki

Version 24 (modified by Antoine Martin, 6 years ago) (diff)

--

Picture Encodings

This page is strongly related to WindowRefresh, the wiki/Network and client rendering are also relevant.

Introduction

Xpra supports a number of picture encodings, provided you have the required libraries installed. Even then, the features of each encoding may vary based on the version of the libraries and other dependencies, both client and server side.
Here is the list as of v0.10

  • lossless encodings:
    • rgb24 (+zlib)
    • png (24/32-bit colour, 8-bit grayscale and 8-bit colour)
    • webp (lossless mode)
  • lossy encodings:
    • jpeg
    • webp (lossy mode)
    • vpx
    • h264: either using x264 or nvenc

Note: for backwards compatibility, you may have to specify the encoding as x264 to get h264.

Choosing an Encoding

The best thing to do is to try them all and choose the one that provides the best results. Here are some rough guidelines:

  • on LANs with 100MBit/s or higher: rgb24 + zlib should give you the best latency possible (whilst consuming quite a lot of bandwidth in the process..)
  • to save a little bit of bandwidth at the expense of framerate and latency, use fast lossless encodings: webp or png
  • otherwise, choose h264 and tune the speed/quality to suit your needs (see below)

The other encodings are somewhat less useful:

  • vpx is similar to x264 but it does not support speed and quality tuning
  • webp (lossy mode) is a single image subset of vpx, and therefore lacks intra-frame compression - but latency is decent
  • jpeg gives lower size/quality than other lossy encodings

Colourspace conversion step - CSC

Before passing the pixels to the video encoder, we may or may not include a colourspace conversion step, (some newer versions of x264 support BGRA pixels as input directly) it is required when downscaling the video.

See: Colourspace conversion step - CSC


Tuning

The best way to choose the right options is through wiki/Testing. Though you may find some good illustrations online to give you an idea of the trade offs. (ie: fps vs noise, fps vs size) Be aware that the lossless auto-refresh will trigger a lossless frame encoded using png or webp. If the delay is too low, it may negate the benefits of using efficient compression.

Notes

When comparing performance, make sure that you use the right metrics... The number of updates per second is not always a good one (if there are more small regions, this can be a good or a bad thing), more examples here: Misleading Statistics