KASM-7125 fixed issue with rebuilding Xvnc, switched to simplier webp mix math.

This commit is contained in:
matt 2025-04-24 16:50:44 +00:00
parent 02852185a8
commit 00b8d025db
No known key found for this signature in database
5 changed files with 65 additions and 85 deletions

View File

@ -76,19 +76,22 @@ if [ ! -d unix/xserver/include ]; then
patch -s -p0 < ../CVE-2022-2320-v1.19.patch patch -s -p0 < ../CVE-2022-2320-v1.19.patch
;; ;;
esac esac
else
cd unix/xserver
fi
autoreconf -i autoreconf -i
# Configuring Xorg is long and has many distro-specific paths. # Configuring Xorg is long and has many distro-specific paths.
# The distro paths start after prefix and end with the font path, # The distro paths start after prefix and end with the font path,
# everything after that is based on BUILDING.txt to remove unneeded # everything after that is based on BUILDING.txt to remove unneeded
# components. # components.
# remove gl check for opensuse # remove gl check for opensuse
if [ "${KASMVNC_BUILD_OS}" == "opensuse" ] || ([ "${KASMVNC_BUILD_OS}" == "oracle" ] && [ "${KASMVNC_BUILD_OS_CODENAME}" == 9 ]); then if [ "${KASMVNC_BUILD_OS}" == "opensuse" ] || ([ "${KASMVNC_BUILD_OS}" == "oracle" ] && [ "${KASMVNC_BUILD_OS_CODENAME}" == 9 ]); then
sed -i 's/LIBGL="gl >= 7.1.0"/LIBGL="gl >= 1.1"/g' configure sed -i 's/LIBGL="gl >= 7.1.0"/LIBGL="gl >= 1.1"/g' configure
fi fi
# build X11 # build X11
./configure \ ./configure \
--disable-config-hal \ --disable-config-hal \
--disable-config-udev \ --disable-config-udev \
--disable-dmx \ --disable-dmx \
@ -112,9 +115,9 @@ if [ ! -d unix/xserver/include ]; then
--with-xkb-output=/var/lib/xkb \ --with-xkb-output=/var/lib/xkb \
--with-xkb-path=/usr/share/X11/xkb "${CONFIG_OPTIONS}" --with-xkb-path=/usr/share/X11/xkb "${CONFIG_OPTIONS}"
# remove array bounds errors for new versions of GCC # remove array bounds errors for new versions of GCC
find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \; find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \;
fi
make -j"$(nproc)" make -j"$(nproc)"

View File

@ -360,7 +360,6 @@ void EncodeManager::doUpdate(bool allowLossy, const Region& changed_,
int nRects; int nRects;
Region changed, cursorRegion; Region changed, cursorRegion;
struct timeval start; struct timeval start;
unsigned screenArea;
updates++; updates++;
if (conn->cp.supportsUdp) if (conn->cp.supportsUdp)
@ -390,17 +389,7 @@ void EncodeManager::doUpdate(bool allowLossy, const Region& changed_,
memset(&webpstats, 0, sizeof(codecstats_t)); memset(&webpstats, 0, sizeof(codecstats_t));
if (allowLossy && activeEncoders[encoderFullColour] == encoderTightWEBP) { if (allowLossy && activeEncoders[encoderFullColour] == encoderTightWEBP) {
const unsigned rate = 1024 * 1000 / rfb::Server::frameRate; webpFallbackUs = (1000 * 1000 / rfb::Server::frameRate) * (static_cast<double>(Server::webpEncodingTime) / 100.0);
screenArea = pb->getRect().width() * pb->getRect().height();
screenArea *= 1024;
screenArea /= 256 * 256;
screenArea *= webpBenchResult;
screenArea /= Server::webpEncodingTime;
// Encoding the entire screen would take this many 1024*msecs, worst case
// Calculate how many us we can send webp for, before switching to jpeg
webpFallbackUs = rate * rate / screenArea;
} }
/* /*
@ -884,7 +873,7 @@ void EncodeManager::findSolidRect(const Rect& rect, Region *changed,
void EncodeManager::checkWebpFallback(const timeval *start) { void EncodeManager::checkWebpFallback(const timeval *start) {
// Have we taken too long for the frame? If so, drop from WEBP to JPEG // Have we taken too long for the frame? If so, drop from WEBP to JPEG
if (start && activeEncoders[encoderFullColour] == encoderTightWEBP && !webpTookTooLong.load(std::memory_order_relaxed)) { if (start && activeEncoders[encoderFullColour] == encoderTightWEBP && !webpTookTooLong.load(std::memory_order_relaxed)) {
const auto us = msSince(start) * 1024; const auto us = msSince(start) * 1000;
if (us > webpFallbackUs) if (us > webpFallbackUs)
webpTookTooLong.store(true, std::memory_order_relaxed); webpTookTooLong.store(true, std::memory_order_relaxed);
} }

View File

@ -290,5 +290,5 @@ rfb::PresetParameter rfb::Server::preferBandwidth
rfb::IntParameter rfb::Server::webpEncodingTime rfb::IntParameter rfb::Server::webpEncodingTime
("webpEncodingTime", ("webpEncodingTime",
"Sets a weighted value that determines how much webp is used to balance bandwidth and CPU usage.", "Percentage of time allotted for encoding a frame, that can be used for encoding rects in webp.",
1, 1, 1000); 30, 0, 100);

View File

@ -129,7 +129,7 @@ encoding:
logging: logging:
level: off level: off
scaling_algorithm: progressive_bilinear scaling_algorithm: progressive_bilinear
webp_encoding_time: auto webp_encoding_time: 30
compare_framebuffer: auto compare_framebuffer: auto
zrle_zlib_level: auto zrle_zlib_level: auto

View File

@ -2073,21 +2073,9 @@ sub DefineConfigToCLIConversion {
configKeys => [ configKeys => [
KasmVNC::ConfigKey->new({ KasmVNC::ConfigKey->new({
name => "encoding.video_encoding_mode.webp_encoding_time", name => "encoding.video_encoding_mode.webp_encoding_time",
validator => KasmVNC::PatternValidator->new({ type => KasmVNC::ConfigKey::INT
pattern => qr/^(auto|[1-9][0-9]{0,2}|1000)$/,
errorMessage => "must be 'auto' or a number in 1..1000"
}),
}) })
], ]
deriveValueSub => sub {
my $self = shift;
my $value = $self->configValue();
if ($value eq "auto") {
$value = 1;
}
$value;
}
}), }),
KasmVNC::CliOption->new({ KasmVNC::CliOption->new({
name => 'CompareFB', name => 'CompareFB',