diff --git a/CHANGELOG.md b/CHANGELOG.md index d2521b68ef8..ace5c51d0d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,38 @@ # Changelog +## [0.18.1] - 2023-01-31 +### Fixed +- (Linux) Fixed missing dependencies for deb and rpm packages +- (Linux) Use dynamic boost + +## [0.18.0] - 2023-01-29 +Attention, this release contains critical security fixes. Please update as soon as possible. Additionally, we are +encouraging users to change your Sunshine password, especially if you expose the web UI (i.e. port 47790 by default) +to the internet, or have ever uploaded your logs with verbose output to a public resource. + +### Added +- (Windows) Add support for Intel QuickSync +- (Linux) Added aarch64 deb and rpm packages +- (Windows) Add support for hybrid graphics systems, such as laptops with both integrated and discrete GPUs +- (Linux) Add support for streaming from Steam Deck Gaming Mode +- (Windows) Add HDR support, see https://docs.lizardbyte.dev/projects/sunshine/en/latest/about/usage.html#hdr-support +### Fixed +- (Network) Refactor code for UPnP port forwarding +- (Video) Enforce 10 FPS encoding frame rate minimum to improve static image quality +- (Linux) deb and rpm packages are now specific to destination distro and version +- (Docs) Add nvidia/nvenc preset migration guide +- (Network) Performance optimizations +- (Video/Windows) Fix streaming to multiple clients from hardware encoder +- (Linux) Fix child process spawning +- (Security) Fix security vulnerability in implementation of SimpleWebServer +- (Misc) Rename "Steam BigPicture" to "Steam Big Picture" in default apps.json +- (Security) Scrub basic authorization header from logs +- (Linux) The systemd service will now restart in the event of a crash +- (Video/KMS/Linux) Fixed error: `couldn't import RGB Image: 00003002 and 00003004` +- (Video/Windows) Fix stream freezing triggered by the resolution changed +- (Installer/Windows) Fixes silent installation and other miscellaneous improvements +- (CPU) Significantly improved CPU usage + ## [0.17.0] - 2023-01-08 If you are running Sunshine as a service on Windows, we are strongly urging you to update to v0.17.0 as soon as possible. Older Windows versions of Sunshine had a security flaw in which the binary was located in a user-writable @@ -272,3 +305,5 @@ settings. In v0.17.0, games now run under your user account without elevated pri [0.15.0]: https://github.com/LizardByte/Sunshine/releases/tag/v0.15.0 [0.16.0]: https://github.com/LizardByte/Sunshine/releases/tag/v0.16.0 [0.17.0]: https://github.com/LizardByte/Sunshine/releases/tag/v0.17.0 +[0.18.0]: https://github.com/LizardByte/Sunshine/releases/tag/v0.18.0 +[0.18.1]: https://github.com/LizardByte/Sunshine/releases/tag/v0.18.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b559f62e22..d7a9e1f6a77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.18) # `CMAKE_CUDA_ARCHITECTURES` requires 3.18 -project(Sunshine VERSION 0.17.0 +project(Sunshine VERSION 0.18.1 DESCRIPTION "Sunshine is a self-hosted game stream host for Moonlight." HOMEPAGE_URL "https://app.lizardbyte.dev") @@ -116,10 +116,8 @@ find_package(OpenSSL REQUIRED) find_package(PkgConfig REQUIRED) pkg_check_modules(CURL REQUIRED libcurl) -if(NOT APPLE) - set(Boost_USE_STATIC_LIBS ON) # cmake-lint: disable=C0103 -endif() if(WIN32) + set(Boost_USE_STATIC_LIBS ON) # cmake-lint: disable=C0103 # workaround to prevent link errors against icudata, icui18n set(Boost_NO_BOOST_CMAKE ON) # cmake-lint: disable=C0103 endif() @@ -424,6 +422,7 @@ ${CMAKE_BINARY_DIR}/generated-src/${filename}.h") third-party/glad/include/glad/egl.h) list(APPEND PLATFORM_LIBRARIES + Boost::dynamic_linking dl evdev numa @@ -513,6 +512,8 @@ else() else() set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-x86_64") list(APPEND FFMPEG_PLATFORM_LIBRARIES mfx) + set(CPACK_DEB_PLATFORM_PACKAGE_DEPENDS "libmfx1,") + set(CPACK_RPM_PLATFORM_PACKAGE_REQUIRES "intel-mediasdk >= 22.3.0,") endif() endif() set(FFMPEG_INCLUDE_DIRS @@ -831,6 +832,7 @@ elseif(UNIX) # Dependencies set(CPACK_DEB_COMPONENT_INSTALL ON) set(CPACK_DEBIAN_PACKAGE_DEPENDS "\ + ${CPACK_DEB_PLATFORM_PACKAGE_DEPENDS} \ libboost-filesystem1.67.0 | libboost-filesystem1.71.0 | libboost-filesystem1.74.0, \ libboost-log1.67.0 | libboost-log1.71.0 | libboost-log1.74.0, \ libboost-program-options1.67.0 | libboost-program-options1.71.0 | libboost-program-options1.74.0, \ @@ -839,13 +841,17 @@ elseif(UNIX) libcurl4, \ libdrm2, \ libevdev2, \ + libnuma1, \ libopus0, \ libpulse0, \ - libxcb-shm0, \ - libxcb-xfixes0, \ - libxtst6, \ - openssl") + libva2, \ + libva-drm2, \ + libvdpau1, \ + libwayland-client0, \ + libx11-6, \ + openssl | libssl3") set(CPACK_RPM_PACKAGE_REQUIRES "\ + ${CPACK_RPM_PLATFORM_PACKAGE_REQUIRES} \ boost-filesystem >= 1.67.0, \ boost-log >= 1.67.0, \ boost-program-options >= 1.67.0, \ @@ -855,9 +861,12 @@ elseif(UNIX) libdrm >= 2.4.97, \ libevdev >= 1.5.6, \ libopusenc >= 0.2.1, \ - libxcb >= 1.13, \ - libXtst >= 1.2.3, \ - openssl >= 1.1, \ + libva >= 2.14.0, \ + libvdpau >= 1.5, \ + libwayland-client >= 1.20.0, \ + libX11 >= 1.7.3.1, \ + numactl-libs >= 2.0.14, \ + openssl >= 3.0.2, \ pulseaudio-libs >= 10.0") # This should automatically figure out dependencies, doesn't work with the current config set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF) diff --git a/docker/fedora-36.dockerfile b/docker/fedora-36.dockerfile index 30c215f89d5..3c1e728c8f9 100644 --- a/docker/fedora-36.dockerfile +++ b/docker/fedora-36.dockerfile @@ -20,7 +20,6 @@ dnf -y update dnf -y group install "Development Tools" dnf -y install \ boost-devel-1.76.0* \ - boost-static-1.76.0* \ cmake-3.22.2* \ gcc-12.0.1* \ gcc-c++-12.0.1* \ diff --git a/docker/fedora-37.dockerfile b/docker/fedora-37.dockerfile index f71837a1c24..547282b5a9d 100644 --- a/docker/fedora-37.dockerfile +++ b/docker/fedora-37.dockerfile @@ -20,7 +20,6 @@ dnf -y update dnf -y group install "Development Tools" dnf -y install \ boost-devel-1.78.0* \ - boost-static-1.78.0* \ cmake-3.24.1* \ gcc-12.2.1* \ gcc-c++-12.2.1* \ diff --git a/docker/ubuntu-22.04.dockerfile b/docker/ubuntu-22.04.dockerfile index d2a85be4d59..a5ef3fd2b6b 100644 --- a/docker/ubuntu-22.04.dockerfile +++ b/docker/ubuntu-22.04.dockerfile @@ -28,7 +28,7 @@ apt-get install -y --no-install-recommends \ libboost-thread-dev=1.74.0* \ libcap-dev=1:2.44* \ libcurl4-openssl-dev=7.81.0* \ - libdrm-dev=2.4.110* \ + libdrm-dev=2.4.113* \ libevdev-dev=1.12.1* \ libnuma-dev=2.0.14* \ libopus-dev=1.3.1* \ diff --git a/docs/requirements.txt b/docs/requirements.txt index 24cbabce74b..9c21c08ffea 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ furo==2022.12.7 -m2r2==0.3.3 +m2r2==0.3.3.post2 Sphinx==6.1.3 sphinx-copybutton==0.5.1 diff --git a/docs/source/building/linux.rst b/docs/source/building/linux.rst index 36f48d273a5..2cb4970e90e 100644 --- a/docs/source/building/linux.rst +++ b/docs/source/building/linux.rst @@ -54,10 +54,10 @@ Install Requirements sudo dnf group install "Development Tools" && \ sudo dnf install \ boost-devel \ - boost-static \ cmake \ gcc \ gcc-c++ \ + intel-mediasdk-devel \ # x86_64 only libcap-devel \ libcurl-devel \ libdrm-devel \ @@ -80,9 +80,7 @@ Install Requirements pulseaudio-libs-devel \ rpm-build \ # if you want to build an RPM binary package wget \ # necessary for cuda install with `run` file - which \ # necessary for cuda install with `run` file - # libmfx-devel is not listed for fedora, this is for x86_64 only - https://kojipkgs.fedoraproject.org//packages/libmfx/1.25/4.el8/x86_64/libmfx-devel-1.25-4.el8.x86_64.rpm + which # necessary for cuda install with `run` file Ubuntu 20.04 ^^^^^^^^^^^^ diff --git a/docs/source/gamestream/gamestream.rst b/docs/source/gamestream/gamestream.rst index c5c8d68dcce..59ba6e1d0e7 100644 --- a/docs/source/gamestream/gamestream.rst +++ b/docs/source/gamestream/gamestream.rst @@ -16,6 +16,5 @@ Limitations ----------- Sunshine does have some limitations, as compared to Nvidia GameStream. -- HDR support is limited and currently HDR is converted to SDR. - Automatic game/application list. - Changing game settings automatically, to optimize streaming. diff --git a/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml b/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml index 1bd9926ec69..d7789a7991e 100644 --- a/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml +++ b/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml @@ -34,7 +34,7 @@ modules: build-commands: - cd tools/build && bison -y -d -o src/engine/jamgram.cpp src/engine/jamgram.y - ./bootstrap.sh --prefix=$FLATPAK_DEST --with-libraries=system,thread,log,program_options || cat bootstrap.log - - ./b2 install variant=release link=static,shared runtime-link=shared cxxflags="$CXXFLAGS" linkflags="$LDFLAGS" + - ./b2 install variant=release link=shared runtime-link=shared cxxflags="$CXXFLAGS" linkflags="$LDFLAGS" -j $FLATPAK_BUILDER_N_JOBS sources: - type: archive @@ -107,24 +107,7 @@ modules: commands: - for n in $(cat patches/series); do if [[ $n != "#"* ]]; then patch -Np1 -i "patches/$n" -d .; fi; done - - name: libdrm - # libdrm-intel is needed for libmfx-dev - disabled: false - buildsystem: meson - only-arches: - - x86_64 - sources: - - type: archive - url: http://archive.ubuntu.com/ubuntu/pool/main/libd/libdrm/libdrm_2.4.110.orig.tar.xz - sha256: eecee4c4b47ed6d6ce1a9be3d6d92102548ea35e442282216d47d05293cf9737 - - type: archive - url: http://archive.ubuntu.com/ubuntu/pool/main/libd/libdrm/libdrm_2.4.110-1ubuntu1.debian.tar.xz - sha256: 464b9553861f39beddfaee6b8924734b02a0febfae3968e4ca1360f2972bba8b - - type: shell - commands: - - for n in $(cat patches/series); do if [[ $n != "#"* ]]; then patch -Np1 -i "patches/$n" -d .; fi; done - - - name: libmfx-dev + - name: intel-mediasdk disabled: false buildsystem: cmake config-opts: @@ -153,7 +136,39 @@ modules: - type: shell commands: - for n in $(cat patches/series); do if [[ $n != "#"* ]]; then patch -Np1 -i "patches/$n" -d .; fi; done + modules: + - name: libdrm + disabled: false + buildsystem: meson + sources: + - type: archive + url: http://archive.ubuntu.com/ubuntu/pool/main/libd/libdrm/libdrm_2.4.110.orig.tar.xz + sha256: eecee4c4b47ed6d6ce1a9be3d6d92102548ea35e442282216d47d05293cf9737 + - type: archive + url: http://archive.ubuntu.com/ubuntu/pool/main/libd/libdrm/libdrm_2.4.110-1ubuntu1.debian.tar.xz + sha256: 464b9553861f39beddfaee6b8924734b02a0febfae3968e4ca1360f2972bba8b + - type: shell + commands: + - for n in $(cat patches/series); do if [[ $n != "#"* ]]; then patch -Np1 -i "patches/$n" -d .; fi; done + - name: numactl + buildsystem: autotools + make-args: + - install + sources: + - type: archive + url: http://archive.ubuntu.com/ubuntu/pool/main/n/numactl/numactl_2.0.14.orig.tar.gz + sha256: 1ee27abd07ff6ba140aaf9bc6379b37825e54496e01d6f7343330cf1a4487035 + - type: archive + url: http://archive.ubuntu.com/ubuntu/pool/main/n/numactl/numactl_2.0.14-3ubuntu2.debian.tar.xz + sha256: 49089e5be5367f6367f8b0389d1d523944432607783b53f0605705792e1015ee + - type: shell + commands: + - for n in $(cat patches/series); do if [[ $n != "#"* ]]; then patch -Np1 -i "patches/$n" -d .; fi; done + cleanup: + - "/bin" + + # Caching is configured until here, not including CUDA - name: cuda disabled: false buildsystem: simple @@ -161,7 +176,7 @@ modules: - x86_64 - aarch64 cleanup: - - '*' + - "*" build-commands: - chmod u+x ./cuda.run - ./cuda.run --silent --toolkit --toolkitpath=$FLATPAK_DEST/cuda --no-opengl-libs --no-man-page --no-drm @@ -182,23 +197,6 @@ modules: sha256: e6e9a8d31163c9776b5e313fd7590877c5684e1ecddee741154f95704d4ed27c dest-filename: cuda.run - - name: numactl - buildsystem: autotools - make-args: - - install - sources: - - type: archive - url: http://archive.ubuntu.com/ubuntu/pool/main/n/numactl/numactl_2.0.14.orig.tar.gz - sha256: 1ee27abd07ff6ba140aaf9bc6379b37825e54496e01d6f7343330cf1a4487035 - - type: archive - url: http://archive.ubuntu.com/ubuntu/pool/main/n/numactl/numactl_2.0.14-3ubuntu2.debian.tar.xz - sha256: 49089e5be5367f6367f8b0389d1d523944432607783b53f0605705792e1015ee - - type: shell - commands: - - for n in $(cat patches/series); do if [[ $n != "#"* ]]; then patch -Np1 -i "patches/$n" -d .; fi; done - cleanup: - - "/bin" - - name: sunshine disabled: false buildsystem: cmake @@ -228,9 +226,9 @@ modules: - -DSUNSHINE_CONFIGURE_FLATPAK=ON sources: - type: git - url: '@GITHUB_CLONE_URL@' - branch: '@GITHUB_BRANCH@' - commit: '@GITHUB_COMMIT@' + url: "@GITHUB_CLONE_URL@" + branch: "@GITHUB_BRANCH@" + commit: "@GITHUB_COMMIT@" post-install: # use `sed` to update apps.json with prefixes required for flatpak # -r (regex) diff --git a/src/video.cpp b/src/video.cpp index a86055c61ef..9389ee3d7dc 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -711,6 +711,7 @@ void reset_display(std::shared_ptr &disp, AVHWDeviceType type, break; } + // The capture code depends on us to sleep between failures std::this_thread::sleep_for(200ms); } } @@ -839,16 +840,32 @@ void captureThread( // Wait for the other shared_ptr's of display to be destroyed. // New displays will only be created in this thread. while(display_wp->use_count() != 1) { - std::this_thread::sleep_for(100ms); + // Free images that weren't consumed by the encoders. These can reference the display and prevent + // the ref count from reaching 1. We do this here rather than on the encoder thread to avoid race + // conditions where the encoding loop might free a good frame after reinitializing if we capture + // a new frame here before the encoder has finished reinitializing. + KITTY_WHILE_LOOP(auto capture_ctx = std::begin(capture_ctxs), capture_ctx != std::end(capture_ctxs), { + if(!capture_ctx->images->running()) { + capture_ctx = capture_ctxs.erase(capture_ctx); + continue; + } + + while(capture_ctx->images->peek()) { + capture_ctx->images->pop(); + } + + ++capture_ctx; + }); + + std::this_thread::sleep_for(20ms); } while(capture_ctx_queue->running()) { + // reset_display() will sleep between retries reset_display(disp, encoder.base_dev_type, display_names[display_p], capture_ctxs.front().config); - if(disp) { break; } - std::this_thread::sleep_for(200ms); } if(!disp) { return; @@ -1273,6 +1290,13 @@ void encode_run( auto packets = mail::man->queue(mail::video_packets); auto idr_events = mail->event(mail::idr); + // Load a dummy image into the AVFrame to ensure we have something to encode + // even if we time out waiting on the first frame. + auto dummy_img = disp->alloc_img(); + if(!dummy_img || disp->dummy_img(dummy_img.get()) || session->device->convert(*dummy_img)) { + return; + } + while(true) { if(shutdown_event->peek() || reinit_event.peek() || !images->running()) { break; @@ -1288,7 +1312,10 @@ void encode_run( // Encode at a minimum of 10 FPS to avoid image quality issues with static content if(!frame->key_frame || images->peek()) { if(auto img = images->pop(100ms)) { - session->device->convert(*img); + if(session->device->convert(*img)) { + BOOST_LOG(error) << "Could not convert image"sv; + return; + } } else if(!images->running()) { break; @@ -1399,12 +1426,11 @@ encode_e encode_run_sync( } while(encode_session_ctx_queue.running()) { + // reset_display() will sleep between retries reset_display(disp, encoder.base_dev_type, display_names[display_p], synced_session_ctxs.front()->config); if(disp) { break; } - - std::this_thread::sleep_for(200ms); } if(!disp) { @@ -1574,15 +1600,9 @@ void capture_async( platf::adjust_thread_priority(platf::thread_priority_e::high); while(!shutdown_event->peek() && images->running()) { - // Free images that weren't consumed by the encoder before it quit. - // This is critical to allow the display_t to be freed correctly. - while(images->peek()) { - images->pop(); - } - // Wait for the main capture event when the display is being reinitialized if(ref->reinit_event.peek()) { - std::this_thread::sleep_for(100ms); + std::this_thread::sleep_for(20ms); continue; } // Wait for the display to be ready @@ -1603,13 +1623,6 @@ void capture_async( return; } - auto dummy_img = display->alloc_img(); - if(!dummy_img || display->dummy_img(dummy_img.get())) { - return; - } - - images->raise(std::move(dummy_img)); - // absolute mouse coordinates require that the dimensions of the screen are known touch_port_event->raise(make_port(display.get(), config));