Version 43 (modified by 8 years ago) (diff) | ,
---|
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)
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 "xpra info
".
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 YUV422P
and YUV420P
do).
CSC Modules
On the server side we currently (as of v0.11) support 4 modules for doing this step:
csc_swscale
which uses FFmpeg's swscale library (CPU based), source here- csc_opencl (GPU or CPU based via OpenCL)
- csc_nvcuda (GPU based via CUDA)
csc_cython
(a slower fallback module in Cython - without scaling support) source here
Note: some of those modules may require you to add some libraries to your library path (ie: CUDA
often does, Nvidia
's OpenCL
libraries do too)
On the client side, if a CSC step is needed, it will use swscale
only (for now). The OpenGL
mode does not need a CSC step as it can display YUV pixels directly on screen, and do the scaling itself too.
Choosing a CSC module
The best way to choose a CSC module is to test them all and compare them.
Specify a module or mode
To choose a specific CSC module, use:
XPRA_CSC_TYPE=name xpra ...
Where name
is one of the csc modules above.
One can also force the use a specific CSC mode:
XPRA_FORCE_CSC_MODE=cscmode xpra ...
Where cscmode
is one of: YUV420P
, YUV422P
, YUV444P
.
Some modules can be configured further, see below:
Scaling
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_SCALING
X11 window property (specified as a 32-bit fraction, 16-bits for each) - the
XPRA_SCALING_HARDCODED
environment variable is set on the server, using one of those 2 forms (the second one is preferred):XPRA_SCALING_HARDCODED=N
to downscale by NXPRA_SCALING_HARDCODED=M:N
to downscale by the fractionM/N
- 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 control
at runtime (see ticket:461#comment:9):xpra control DISPLAY scaling "*" 2:3
will scale all windows ("*") by 2/3rd onDISPLAY
(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.