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]]
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",

View File

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

View File

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

View File

@ -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

View File

@ -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"
;;
*)

View File

@ -10,7 +10,7 @@ bench = false
[package]
name = "lesavka_server"
version = "0.22.8"
version = "0.22.9"
edition = "2024"
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() {
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",

View File

@ -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!(