Files
ambilight-plasmoid/setup-kmsgrab.sh
T
enne2 47b5c09fa1 kmsgrab e ScreenShot2: esiti sperimentali documentati
- kmsgrab non praticabile: piano primario AR30 con modifier AMD DCC/tiled, ffmpeg
  rifiuta il framebuffer prima di applicare format/modifier
- KWin ScreenShot2: NoAuthorized anche con desktop entry system-wide
- indicatore del vassoio identificato come SNI di xdg-desktop-portal-kde
  (titolo 'Trasmissione dello schermo')
- backend kmsgrab comunque implementato e selezionabile (capture=kmsgrab)
- setup-kmsgrab.sh: installa via pkexec una copia di ffmpeg con cap_sys_admin+ep
2026-11-01 13:22:03 +01:00

50 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# Installa (via pkexec) una copia di ffmpeg con CAP_SYS_ADMIN, necessaria per kmsgrab.
# La capability e' confinata a QUELLA copia del binario, non a /usr/bin/ffmpeg.
#
# ./setup-kmsgrab.sh installa
# ./setup-kmsgrab.sh --remove rimuove
set -euo pipefail
DEST="/usr/local/libexec/ambilight/ffmpeg-kmsgrab"
SRC="$(command -v ffmpeg)"
say() { printf '\033[1;32m==>\033[0m %s\n' "$*"; }
if [ "${1:-}" = "--remove" ]; then
say "Rimuovo $DEST"
pkexec sh -c "rm -f '$DEST' && rmdir --ignore-fail-on-non-empty /usr/local/libexec/ambilight 2>/dev/null || true"
say "Fatto."
exit 0
fi
[ -x "$SRC" ] || { echo "ffmpeg non trovato" >&2; exit 1; }
say "Installo $SRC -> $DEST con cap_sys_admin+ep (pkexec chiedera' la password)"
pkexec sh -c "install -D -m 0755 -o root -g root '$SRC' '$DEST' \
&& setcap cap_sys_admin+ep '$DEST' \
&& echo '--- capability applicata:' && getcap '$DEST'"
say "Verifica rapida (1 frame, senza portal e senza indicatore nel vassoio)"
"$DEST" -hide_banner -loglevel error -nostdin \
-f kmsgrab -device /dev/dri/card1 -i - \
-vf "hwdownload,format=bgr0,scale=188:72:flags=bilinear,format=rgb24" \
-frames:v 1 -f rawvideo -pix_fmt rgb24 /tmp/kmsgrab_probe.rgb
ls -l /tmp/kmsgrab_probe.rgb
python3 - <<'PY'
import numpy as np
a = np.frombuffer(open('/tmp/kmsgrab_probe.rgb','rb').read(), dtype=np.uint8)
print("frame:", a.size, "byte ->", a[:9].tolist(), "| media:", a.reshape(-1,3).mean(axis=0).round(1).tolist())
PY
cat <<EOF
Attiva il backend nel demone:
ambilight-ctl set capture kmsgrab
systemctl --user restart ambilight.service
ambilight-ctl state # controlla 'fps' e assenza di 'stream_error'
Per tornare al portal: ambilight-ctl set capture portal
EOF