diff --git a/builder/build.sh b/builder/build.sh index ed481df..332fd27 100755 --- a/builder/build.sh +++ b/builder/build.sh @@ -76,46 +76,49 @@ if [ ! -d unix/xserver/include ]; then patch -s -p0 < ../CVE-2022-2320-v1.19.patch ;; esac - - autoreconf -i - # Configuring Xorg is long and has many distro-specific paths. - # The distro paths start after prefix and end with the font path, - # everything after that is based on BUILDING.txt to remove unneeded - # components. - # remove gl check for opensuse - 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 - fi - - # build X11 - ./configure \ - --disable-config-hal \ - --disable-config-udev \ - --disable-dmx \ - --disable-dri \ - --disable-dri2 \ - --disable-kdrive \ - --disable-static \ - --disable-xephyr \ - --disable-xinerama \ - --disable-xnest \ - --disable-xorg \ - --disable-xvfb \ - --disable-xwayland \ - --disable-xwin \ - --enable-glx \ - --prefix=/opt/kasmweb \ - --with-default-font-path="/usr/share/fonts/X11/misc,/usr/share/fonts/X11/cyrillic,/usr/share/fonts/X11/100dpi/:unscaled,/usr/share/fonts/X11/75dpi/:unscaled,/usr/share/fonts/X11/Type1,/usr/share/fonts/X11/100dpi,/usr/share/fonts/X11/75dpi,built-ins" \ - --without-dtrace \ - --with-sha1=libcrypto \ - --with-xkb-bin-directory=/usr/bin \ - --with-xkb-output=/var/lib/xkb \ - --with-xkb-path=/usr/share/X11/xkb "${CONFIG_OPTIONS}" - - # remove array bounds errors for new versions of GCC - find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \; +else + cd unix/xserver fi +autoreconf -i +# Configuring Xorg is long and has many distro-specific paths. +# The distro paths start after prefix and end with the font path, +# everything after that is based on BUILDING.txt to remove unneeded +# components. +# remove gl check for opensuse +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 +fi + +# build X11 +./configure \ + --disable-config-hal \ + --disable-config-udev \ + --disable-dmx \ + --disable-dri \ + --disable-dri2 \ + --disable-kdrive \ + --disable-static \ + --disable-xephyr \ + --disable-xinerama \ + --disable-xnest \ + --disable-xorg \ + --disable-xvfb \ + --disable-xwayland \ + --disable-xwin \ + --enable-glx \ + --prefix=/opt/kasmweb \ + --with-default-font-path="/usr/share/fonts/X11/misc,/usr/share/fonts/X11/cyrillic,/usr/share/fonts/X11/100dpi/:unscaled,/usr/share/fonts/X11/75dpi/:unscaled,/usr/share/fonts/X11/Type1,/usr/share/fonts/X11/100dpi,/usr/share/fonts/X11/75dpi,built-ins" \ + --without-dtrace \ + --with-sha1=libcrypto \ + --with-xkb-bin-directory=/usr/bin \ + --with-xkb-output=/var/lib/xkb \ + --with-xkb-path=/usr/share/X11/xkb "${CONFIG_OPTIONS}" + +# remove array bounds errors for new versions of GCC +find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \; + + make -j"$(nproc)" # modifications for the servertarball diff --git a/common/rfb/EncodeManager.cxx b/common/rfb/EncodeManager.cxx index 5e94cdc..5dbf1dc 100644 --- a/common/rfb/EncodeManager.cxx +++ b/common/rfb/EncodeManager.cxx @@ -360,7 +360,6 @@ void EncodeManager::doUpdate(bool allowLossy, const Region& changed_, int nRects; Region changed, cursorRegion; struct timeval start; - unsigned screenArea; updates++; if (conn->cp.supportsUdp) @@ -390,16 +389,7 @@ void EncodeManager::doUpdate(bool allowLossy, const Region& changed_, memset(&webpstats, 0, sizeof(codecstats_t)); if (allowLossy && activeEncoders[encoderFullColour] == encoderTightWEBP) { - const unsigned rate = 1024 * 1000 / rfb::Server::frameRate; - - screenArea = pb->getRect().width() * pb->getRect().height(); - screenArea *= 1024; - screenArea /= 256 * 256; - screenArea *= webpBenchResult; - // 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; + webpFallbackUs = (1000 * 1000 / rfb::Server::frameRate) * (static_cast(Server::webpEncodingTime) / 100.0); } /* @@ -883,7 +873,7 @@ void EncodeManager::findSolidRect(const Rect& rect, Region *changed, void EncodeManager::checkWebpFallback(const timeval *start) { // 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)) { - const auto us = msSince(start) * 1024; + const auto us = msSince(start) * 1000; if (us > webpFallbackUs) webpTookTooLong.store(true, std::memory_order_relaxed); } diff --git a/common/rfb/ServerCore.cxx b/common/rfb/ServerCore.cxx index 03a69d9..3881693 100644 --- a/common/rfb/ServerCore.cxx +++ b/common/rfb/ServerCore.cxx @@ -287,3 +287,8 @@ rfb::PresetParameter rfb::Server::preferBandwidth ("PreferBandwidth", "Set various options for lower bandwidth use. The default is off, aka to prefer quality.", false, bandwidthPreset); + +rfb::IntParameter rfb::Server::webpEncodingTime +("webpEncodingTime", + "Percentage of time allotted for encoding a frame, that can be used for encoding rects in webp.", + 30, 0, 100); diff --git a/common/rfb/ServerCore.h b/common/rfb/ServerCore.h index 2035cf6..c3a53e5 100644 --- a/common/rfb/ServerCore.h +++ b/common/rfb/ServerCore.h @@ -91,6 +91,7 @@ namespace rfb { static BoolParameter ignoreClientSettingsKasm; static BoolParameter selfBench; static PresetParameter preferBandwidth; + static IntParameter webpEncodingTime; }; }; diff --git a/common/rfb/TightWEBPEncoder.cxx b/common/rfb/TightWEBPEncoder.cxx index 89d9b3a..2e79c6c 100644 --- a/common/rfb/TightWEBPEncoder.cxx +++ b/common/rfb/TightWEBPEncoder.cxx @@ -259,13 +259,14 @@ void TightWEBPEncoder::writeRect(const PixelBuffer* pb, const Palette& palette) WebPMemoryWriterClear(&wrt); } -// How many milliseconds would it take to encode a 256x256 block at quality 8 +// How many milliseconds would it take to encode a 256x256 block at quality 5 rdr::U32 TightWEBPEncoder::benchmark() const { rdr::U8* buffer; struct timeval start; int stride, i; - const uint8_t quality = 8, method = 2; + // the minimum WebP quality settings used in KasmVNC + const uint8_t quality = 5, method = 0; WebPConfig cfg; WebPPicture pic; WebPMemoryWriter wrt; diff --git a/unix/kasmvnc_defaults.yaml b/unix/kasmvnc_defaults.yaml index 3d0551c..afad666 100644 --- a/unix/kasmvnc_defaults.yaml +++ b/unix/kasmvnc_defaults.yaml @@ -37,7 +37,7 @@ user_session: keyboard: remap_keys: - # - 0x22->0x40 + # - 0x22->0x40 ignore_numlock: false raw_keyboard: false @@ -129,6 +129,7 @@ encoding: logging: level: off scaling_algorithm: progressive_bilinear + webp_encoding_time: 30 compare_framebuffer: auto zrle_zlib_level: auto diff --git a/unix/vncserver b/unix/vncserver index 41fc1be..1ac99c8 100755 --- a/unix/vncserver +++ b/unix/vncserver @@ -2068,6 +2068,15 @@ sub DefineConfigToCLIConversion { $value; } }), + KasmVNC::CliOption->new({ + name => 'WebpEncodingTime', + configKeys => [ + KasmVNC::ConfigKey->new({ + name => "encoding.video_encoding_mode.webp_encoding_time", + type => KasmVNC::ConfigKey::INT + }) + ] + }), KasmVNC::CliOption->new({ name => 'CompareFB', configKeys => [