Colourspace conversion step - CSC
Before passing the pixels to the video encoder, we may or may not include a colourspace conversion step. (ie: newer versions of x264 support
BGRA pixels as input directly).
This conversion step is often used for chroma subsampling which reduces the size of the data to compress.
Information and Diagnostics
The pixel format used as input as well as the CSC module chosen to do this conversion work can be found via "
It will be chosen automatically based on the desired speed/quality settings. Note that the CSC step may degrade the quality of the picture (
YUV444P mode does not, but
On the server side we currently (as of v0.11) support 4 modules for doing this step:
- csc_libyuv which uses libyuv's optimized CPU code (new in 0.17 - the fastest option)
- csc_swscale which uses FFmpeg's swscale library (CPU based)
- csc_opencl (GPU or CPU based via OpenCL - deprecated)
- csc_opencv which uses http://opencv.org (deprecated)
- csc_cython: a much slower fallback module written in Cython (deprecated)
Note: some of those modules may require you to add some libraries to your library path (ie:
On the client side, the OpenGL rendering mode does not need a CSC step as it can display YUV pixels directly on screen, and does the scaling itself too.
Choosing a CSC module
The best way to choose a CSC module is to test them all and compare them.
Some rough guidelines:
- if you can use NVENC, then do so: the CSC step is built-in and will use the GPU hardware
- otherwise, use
- if you are CPU starved and have GPU cycles to spare, then you may want to try
Specify a module or mode
You can choose which CSC modules are loaded using the
--csc-modules= command line option. ie:
One can also force the use a specific CSC mode:
XPRA_FORCE_CSC_MODE=cscmode xpra ...
cscmode is one of:
Some modules can be configured further, ie: see wiki/CSC/OpenCL.
As part of the colourspace conversion step, we can also downscale the frame if the
XPRA_SCALING environment variable is unset or set to "1", and either:
- the application requests scaling using the
_XPRA_SCALINGX11 window property (specified as a 32-bit fraction, 16-bits for each)
XPRA_SCALING_HARDCODEDenvironment variable is set on the server, using one of those 2 forms (the second one is preferred):
XPRA_SCALING_HARDCODED=Nto downscale by N
XPRA_SCALING_HARDCODED=M:Nto downscale by the fraction
- automatically, using some heuristics (the bigger the picture size and the lower the quality + the higher the speed - the more likely it is that it will be enabled)
- manually using
xpra controlat runtime (see ticket:461#comment:9):
xpra control DISPLAY scaling "*" 2:3will scale all windows ("*") by 2/3rd on
DISPLAY(replace with your actual display number or URI)
Note: when downscaling is enabled, this may introduce a colourspace conversion step where none was necessary before (when the encoder was previously handling RGB pixel data directly).
Only some encoders can handle the scaling natively (and therefore at almost no cost), nvenc does.