install: refresh gstreamer registry for nvidia

This commit is contained in:
Brad Stein 2026-05-12 03:58:12 -03:00
parent a3e0bb8d62
commit 5ec380a3cc
8 changed files with 44 additions and 14 deletions

6
Cargo.lock generated
View File

@ -1652,7 +1652,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]] [[package]]
name = "lesavka_client" name = "lesavka_client"
version = "0.22.8" version = "0.22.9"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-stream", "async-stream",
@ -1686,7 +1686,7 @@ dependencies = [
[[package]] [[package]]
name = "lesavka_common" name = "lesavka_common"
version = "0.22.8" version = "0.22.9"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64", "base64",
@ -1698,7 +1698,7 @@ dependencies = [
[[package]] [[package]]
name = "lesavka_server" name = "lesavka_server"
version = "0.22.8" version = "0.22.9"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64", "base64",

View File

@ -4,7 +4,7 @@ path = "src/main.rs"
[package] [package]
name = "lesavka_client" name = "lesavka_client"
version = "0.22.8" version = "0.22.9"
edition = "2024" edition = "2024"
[dependencies] [dependencies]

View File

@ -1,6 +1,6 @@
[package] [package]
name = "lesavka_common" name = "lesavka_common"
version = "0.22.8" version = "0.22.9"
edition = "2024" edition = "2024"
build = "build.rs" build = "build.rs"

View File

@ -124,7 +124,7 @@ require_linkable() {
require_gst_element() { require_gst_element() {
local element=$1 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 return 0
fi fi
echo "❌ required GStreamer element '$element' is unavailable after install." >&2 echo "❌ required GStreamer element '$element' is unavailable after install." >&2
@ -132,7 +132,7 @@ require_gst_element() {
} }
gst_element_available() { 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() { first_available_gst_element() {
@ -147,7 +147,7 @@ first_available_gst_element() {
} }
report_client_media_acceleration() { report_client_media_acceleration() {
log "1e. Inspecting client media acceleration routes" log "1f. Inspecting client media acceleration routes"
local hevc_encoder="" local hevc_encoder=""
local ffmpeg_hevc_encoder="" local ffmpeg_hevc_encoder=""
@ -161,6 +161,7 @@ report_client_media_acceleration() {
hevc_encoder=$(first_available_gst_element \ hevc_encoder=$(first_available_gst_element \
nvh265enc \ nvh265enc \
nvautogpuh265enc \
vah265enc \ vah265enc \
vaapih265enc \ vaapih265enc \
v4l2h265enc || true) v4l2h265enc || true)
@ -170,13 +171,13 @@ report_client_media_acceleration() {
fi fi
h264_encoder=$(first_available_gst_element \ h264_encoder=$(first_available_gst_element \
nvh264enc \ nvh264enc \
vulkanh264enc \ nvautogpuh264enc \
vah264enc \
vaapih264enc \ vaapih264enc \
v4l2h264enc || true) v4l2h264enc || true)
h264_decoder=$(first_available_gst_element \ h264_decoder=$(first_available_gst_element \
nvh264dec \ nvh264dec \
nvh264sldec \ nvh264sldec \
vulkanh264dec \
vah264dec \ vah264dec \
vaapih264dec \ vaapih264dec \
v4l2h264dec \ v4l2h264dec \
@ -185,7 +186,7 @@ report_client_media_acceleration() {
opus_decoder=$(first_available_gst_element opusdec || true) opus_decoder=$(first_available_gst_element opusdec || true)
webrtc_dsp=$(first_available_gst_element webrtcdsp || 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 if gst_element_available "$element"; then
proprietary_bits+=("$element") proprietary_bits+=("$element")
fi fi
@ -286,6 +287,18 @@ run_as_user() {
sudo -u "$ORIG_USER" env HOME="$USER_HOME" SSH_AUTH_SOCK="${SSH_AUTH_SOCK:-}" "$@" 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() { install_verified_executable() {
local src=$1 local src=$1
local dest=$2 local dest=$2
@ -486,6 +499,7 @@ if [[ -e /usr/lib/libclang.so ]]; then
require_linkable /usr/lib/libclang.so "libclang" require_linkable /usr/lib/libclang.so "libclang"
fi fi
require_kernel_module snd_usb_audio "USB microphones and USB headsets" require_kernel_module snd_usb_audio "USB microphones and USB headsets"
refresh_gstreamer_registry_cache
require_gst_element pulsesrc require_gst_element pulsesrc
require_gst_element pulsesink require_gst_element pulsesink
require_gst_element pipewiresrc require_gst_element pipewiresrc

View File

@ -177,12 +177,16 @@ require_prereqs() {
select_gst_h264_decoder() { select_gst_h264_decoder() {
local 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 if gst_has "${decoder}"; then
printf '%s\n' "${decoder}" printf '%s\n' "${decoder}"
return 0 return 0
fi fi
done done
if [[ ${LESAVKA_ALLOW_VULKAN_H264_DECODER:-0} == 1 ]] && gst_has vulkanh264dec; then
printf '%s\n' vulkanh264dec
return 0
fi
return 1 return 1
} }
@ -191,7 +195,7 @@ gst_h264_decode_chain() {
vulkanh264dec) vulkanh264dec)
printf '%s\n' 'vulkanh264dec discard-corrupted-frames=true automatic-request-sync-points=true ! vulkandownload' 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" printf '%s\n' "$1"
;; ;;
*) *)

View File

@ -10,7 +10,7 @@ bench = false
[package] [package]
name = "lesavka_server" name = "lesavka_server"
version = "0.22.8" version = "0.22.9"
edition = "2024" edition = "2024"
autobins = false autobins = false

View File

@ -83,6 +83,11 @@ fn client_install_prefers_invoked_checkout_for_development_installs() {
fn client_install_reports_nvidia_and_open_source_media_routes() { fn client_install_reports_nvidia_and_open_source_media_routes() {
for expected in [ for expected in [
"report_client_media_acceleration", "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", "gst_element_available",
"first_available_gst_element", "first_available_gst_element",
"nvidia-smi is available", "nvidia-smi is available",
@ -91,9 +96,13 @@ fn client_install_reports_nvidia_and_open_source_media_routes() {
"proprietary NVIDIA GStreamer route", "proprietary NVIDIA GStreamer route",
"Vulkan/VAAPI/V4L2 GStreamer route", "Vulkan/VAAPI/V4L2 GStreamer route",
"nvh265enc", "nvh265enc",
"nvautogpuh265enc",
"nvh265dec",
"nvh264enc", "nvh264enc",
"nvautogpuh264enc",
"nvh264dec", "nvh264dec",
"nvh264sldec", "nvh264sldec",
"vah264enc",
"vulkanh264enc", "vulkanh264enc",
"vulkanh264dec", "vulkanh264dec",
"vulkanh265dec", "vulkanh265dec",

View File

@ -37,8 +37,11 @@ fn hardware_media_smoke_uses_accelerated_video_paths() {
"h264_nvenc", "h264_nvenc",
"hevc_cuvid", "hevc_cuvid",
"h264_cuvid", "h264_cuvid",
"vah264dec",
"vulkanh264dec", "vulkanh264dec",
"v4l2slh264dec",
"v4l2slh265dec", "v4l2slh265dec",
"LESAVKA_ALLOW_VULKAN_H264_DECODER",
"no sudo, no systemctl, no UVC gadget reset", "no sudo, no systemctl, no UVC gadget reset",
] { ] {
assert!( assert!(