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
This commit is contained in:
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user