- 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
50 lines
1.7 KiB
Bash
Executable File
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
|