From 5ec380a3cc9eb0e7cd1e983cc553edbedb0690e9 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Tue, 12 May 2026 03:58:12 -0300 Subject: [PATCH] install: refresh gstreamer registry for nvidia --- Cargo.lock | 6 ++--- client/Cargo.toml | 2 +- common/Cargo.toml | 2 +- scripts/install/client.sh | 26 ++++++++++++++----- scripts/manual/run_hardware_media_smoke.sh | 8 ++++-- server/Cargo.toml | 2 +- .../install/client_install_script_contract.rs | 9 +++++++ .../hardware_media_smoke_contract.rs | 3 +++ 8 files changed, 44 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4586813..8fca056 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1652,7 +1652,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "lesavka_client" -version = "0.22.8" +version = "0.22.9" dependencies = [ "anyhow", "async-stream", @@ -1686,7 +1686,7 @@ dependencies = [ [[package]] name = "lesavka_common" -version = "0.22.8" +version = "0.22.9" dependencies = [ "anyhow", "base64", @@ -1698,7 +1698,7 @@ dependencies = [ [[package]] name = "lesavka_server" -version = "0.22.8" +version = "0.22.9" dependencies = [ "anyhow", "base64", diff --git a/client/Cargo.toml b/client/Cargo.toml index 9eda67b..b4d40c5 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "lesavka_client" -version = "0.22.8" +version = "0.22.9" edition = "2024" [dependencies] diff --git a/common/Cargo.toml b/common/Cargo.toml index 0a372d3..906f695 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lesavka_common" -version = "0.22.8" +version = "0.22.9" edition = "2024" build = "build.rs" diff --git a/scripts/install/client.sh b/scripts/install/client.sh index 4239ff5..18aa91e 100755 --- a/scripts/install/client.sh +++ b/scripts/install/client.sh @@ -124,7 +124,7 @@ require_linkable() { require_gst_element() { local element=$1 - if gst-inspect-1.0 "$element" >/dev/null 2>&1; then + if run_as_user gst-inspect-1.0 "$element" >/dev/null 2>&1; then return 0 fi echo "❌ required GStreamer element '$element' is unavailable after install." >&2 @@ -132,7 +132,7 @@ require_gst_element() { } gst_element_available() { - gst-inspect-1.0 "$1" >/dev/null 2>&1 + run_as_user gst-inspect-1.0 "$1" >/dev/null 2>&1 } first_available_gst_element() { @@ -147,7 +147,7 @@ first_available_gst_element() { } report_client_media_acceleration() { - log "1e. Inspecting client media acceleration routes" + log "1f. Inspecting client media acceleration routes" local hevc_encoder="" local ffmpeg_hevc_encoder="" @@ -161,6 +161,7 @@ report_client_media_acceleration() { hevc_encoder=$(first_available_gst_element \ nvh265enc \ + nvautogpuh265enc \ vah265enc \ vaapih265enc \ v4l2h265enc || true) @@ -170,13 +171,13 @@ report_client_media_acceleration() { fi h264_encoder=$(first_available_gst_element \ nvh264enc \ - vulkanh264enc \ + nvautogpuh264enc \ + vah264enc \ vaapih264enc \ v4l2h264enc || true) h264_decoder=$(first_available_gst_element \ nvh264dec \ nvh264sldec \ - vulkanh264dec \ vah264dec \ vaapih264dec \ v4l2h264dec \ @@ -185,7 +186,7 @@ report_client_media_acceleration() { opus_decoder=$(first_available_gst_element opusdec || true) webrtc_dsp=$(first_available_gst_element webrtcdsp || true) - for element in nvh265enc nvh264dec nvh264sldec; do + for element in nvh265enc nvautogpuh265enc nvh265dec nvh264enc nvautogpuh264enc nvh264dec nvh264sldec; do if gst_element_available "$element"; then proprietary_bits+=("$element") fi @@ -286,6 +287,18 @@ run_as_user() { sudo -u "$ORIG_USER" env HOME="$USER_HOME" SSH_AUTH_SOCK="${SSH_AUTH_SOCK:-}" "$@" } +refresh_gstreamer_registry_cache() { + log "1e. Refreshing GStreamer plugin registry" + run_as_user mkdir -p "$USER_HOME/.cache/gstreamer-1.0" + run_as_user rm -f "$USER_HOME/.cache/gstreamer-1.0"/registry.* 2>/dev/null || true + sudo rm -f /root/.cache/gstreamer-1.0/registry.* 2>/dev/null || true + + # Touch the GPU codec plugins after cache removal so stale pre-driver caches + # cannot hide NVIDIA/VAAPI decoder factories from the live desktop app. + run_as_user gst-inspect-1.0 nvcodec >/dev/null 2>&1 || true + run_as_user gst-inspect-1.0 va >/dev/null 2>&1 || true +} + install_verified_executable() { local src=$1 local dest=$2 @@ -486,6 +499,7 @@ if [[ -e /usr/lib/libclang.so ]]; then require_linkable /usr/lib/libclang.so "libclang" fi require_kernel_module snd_usb_audio "USB microphones and USB headsets" +refresh_gstreamer_registry_cache require_gst_element pulsesrc require_gst_element pulsesink require_gst_element pipewiresrc diff --git a/scripts/manual/run_hardware_media_smoke.sh b/scripts/manual/run_hardware_media_smoke.sh index 1367a3e..434fb74 100755 --- a/scripts/manual/run_hardware_media_smoke.sh +++ b/scripts/manual/run_hardware_media_smoke.sh @@ -177,12 +177,16 @@ require_prereqs() { select_gst_h264_decoder() { local decoder - for decoder in nvh264sldec nvh264dec vulkanh264dec vaapih264dec vaapi264dec v4l2h264dec; do + for decoder in nvh264dec nvh264sldec vah264dec vaapih264dec vaapi264dec v4l2h264dec v4l2slh264dec; do if gst_has "${decoder}"; then printf '%s\n' "${decoder}" return 0 fi done + if [[ ${LESAVKA_ALLOW_VULKAN_H264_DECODER:-0} == 1 ]] && gst_has vulkanh264dec; then + printf '%s\n' vulkanh264dec + return 0 + fi return 1 } @@ -191,7 +195,7 @@ gst_h264_decode_chain() { vulkanh264dec) printf '%s\n' 'vulkanh264dec discard-corrupted-frames=true automatic-request-sync-points=true ! vulkandownload' ;; - nvh264sldec|nvh264dec|vaapih264dec|vaapi264dec|v4l2h264dec) + nvh264sldec|nvh264dec|vah264dec|vaapih264dec|vaapi264dec|v4l2h264dec|v4l2slh264dec) printf '%s\n' "$1" ;; *) diff --git a/server/Cargo.toml b/server/Cargo.toml index b63cd9f..bb9e232 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -10,7 +10,7 @@ bench = false [package] name = "lesavka_server" -version = "0.22.8" +version = "0.22.9" edition = "2024" autobins = false diff --git a/tests/installer/scripts/install/client_install_script_contract.rs b/tests/installer/scripts/install/client_install_script_contract.rs index df55ade..001bd2b 100644 --- a/tests/installer/scripts/install/client_install_script_contract.rs +++ b/tests/installer/scripts/install/client_install_script_contract.rs @@ -83,6 +83,11 @@ fn client_install_prefers_invoked_checkout_for_development_installs() { fn client_install_reports_nvidia_and_open_source_media_routes() { for expected in [ "report_client_media_acceleration", + "refresh_gstreamer_registry_cache", + "Refreshing GStreamer plugin registry", + "run_as_user rm -f \"$USER_HOME/.cache/gstreamer-1.0\"/registry.*", + "gst-inspect-1.0 nvcodec", + "gst-inspect-1.0 va", "gst_element_available", "first_available_gst_element", "nvidia-smi is available", @@ -91,9 +96,13 @@ fn client_install_reports_nvidia_and_open_source_media_routes() { "proprietary NVIDIA GStreamer route", "Vulkan/VAAPI/V4L2 GStreamer route", "nvh265enc", + "nvautogpuh265enc", + "nvh265dec", "nvh264enc", + "nvautogpuh264enc", "nvh264dec", "nvh264sldec", + "vah264enc", "vulkanh264enc", "vulkanh264dec", "vulkanh265dec", diff --git a/tests/manual/hardware_media/hardware_media_smoke_contract.rs b/tests/manual/hardware_media/hardware_media_smoke_contract.rs index 5cc36dd..0be1c87 100644 --- a/tests/manual/hardware_media/hardware_media_smoke_contract.rs +++ b/tests/manual/hardware_media/hardware_media_smoke_contract.rs @@ -37,8 +37,11 @@ fn hardware_media_smoke_uses_accelerated_video_paths() { "h264_nvenc", "hevc_cuvid", "h264_cuvid", + "vah264dec", "vulkanh264dec", + "v4l2slh264dec", "v4l2slh265dec", + "LESAVKA_ALLOW_VULKAN_H264_DECODER", "no sudo, no systemctl, no UVC gadget reset", ] { assert!(