test(sync): auto-select theia host capture mode

This commit is contained in:
Brad Stein 2026-04-25 04:51:09 -03:00
parent c482f44fbc
commit 2aa4a27f9f

View File

@ -18,13 +18,14 @@ TAIL_SECONDS=${TAIL_SECONDS:-2}
CAPTURE_SECONDS=${CAPTURE_SECONDS:-$((PROBE_DURATION_SECONDS + PROBE_WARMUP_SECONDS + LEAD_IN_SECONDS + TAIL_SECONDS))} CAPTURE_SECONDS=${CAPTURE_SECONDS:-$((PROBE_DURATION_SECONDS + PROBE_WARMUP_SECONDS + LEAD_IN_SECONDS + TAIL_SECONDS))}
REMOTE_CAPTURE=${REMOTE_CAPTURE:-/tmp/lesavka-upstream-av-sync.mkv} REMOTE_CAPTURE=${REMOTE_CAPTURE:-/tmp/lesavka-upstream-av-sync.mkv}
LOCAL_OUTPUT_DIR=${LOCAL_OUTPUT_DIR:-"${REPO_ROOT}/tmp"} LOCAL_OUTPUT_DIR=${LOCAL_OUTPUT_DIR:-"${REPO_ROOT}/tmp"}
VIDEO_SIZE=${VIDEO_SIZE:-1280x720} VIDEO_SIZE=${VIDEO_SIZE:-auto}
VIDEO_FPS=${VIDEO_FPS:-30} VIDEO_FPS=${VIDEO_FPS:-30}
VIDEO_FORMAT=${VIDEO_FORMAT:-mjpeg} VIDEO_FORMAT=${VIDEO_FORMAT:-mjpeg}
REMOTE_CAPTURE_STACK=${REMOTE_CAPTURE_STACK:-auto} REMOTE_CAPTURE_STACK=${REMOTE_CAPTURE_STACK:-auto}
REMOTE_AUDIO_SOURCE=${REMOTE_AUDIO_SOURCE:-auto} REMOTE_AUDIO_SOURCE=${REMOTE_AUDIO_SOURCE:-auto}
REMOTE_AUDIO_QUIESCE_USER_AUDIO=${REMOTE_AUDIO_QUIESCE_USER_AUDIO:-auto} REMOTE_AUDIO_QUIESCE_USER_AUDIO=${REMOTE_AUDIO_QUIESCE_USER_AUDIO:-auto}
ANALYSIS_NORMALIZE=${ANALYSIS_NORMALIZE:-1} ANALYSIS_NORMALIZE=${ANALYSIS_NORMALIZE:-1}
ANALYSIS_SCALE_WIDTH=${ANALYSIS_SCALE_WIDTH:-1280}
SSH_OPTS=${SSH_OPTS:-"-o BatchMode=yes -o ConnectTimeout=5"} SSH_OPTS=${SSH_OPTS:-"-o BatchMode=yes -o ConnectTimeout=5"}
LOCAL_AUDIO_SANITY=${LOCAL_AUDIO_SANITY:-1} LOCAL_AUDIO_SANITY=${LOCAL_AUDIO_SANITY:-1}
PROBE_PREBUILD=${PROBE_PREBUILD:-1} PROBE_PREBUILD=${PROBE_PREBUILD:-1}
@ -78,10 +79,6 @@ remote_audio_source=$7
remote_audio_quiesce_user_audio=$8 remote_audio_quiesce_user_audio=$8
rm -f "${remote_capture}" rm -f "${remote_capture}"
video_args=(-f video4linux2 -framerate "${video_fps}" -video_size "${video_size}")
if [[ -n "${video_format}" ]]; then
video_args+=(-input_format "${video_format}")
fi
restore_user_audio() { restore_user_audio() {
systemctl --user start pipewire.socket pipewire-pulse.socket wireplumber.service >/dev/null 2>&1 || true systemctl --user start pipewire.socket pipewire-pulse.socket wireplumber.service >/dev/null 2>&1 || true
@ -111,11 +108,33 @@ resolve_pulse_source() {
' '
} }
resolve_video_size() {
local requested=$1
if [[ "${requested}" != "auto" ]]; then
printf '%s\n' "${requested}"
return 0
fi
if ! command -v v4l2-ctl >/dev/null 2>&1; then
printf '1280x720\n'
return 0
fi
local listing
listing="$(v4l2-ctl -d /dev/video0 --list-formats-ext 2>/dev/null || true)"
local preferred
for preferred in 1920x1080 1360x768 1280x720; do
if grep -q "Size: Discrete ${preferred}" <<<"${listing}"; then
printf '%s\n' "${preferred}"
return 0
fi
done
printf '1280x720\n'
}
resolve_pw_audio_target() { resolve_pw_audio_target() {
if ! command -v pw-dump >/dev/null 2>&1 || ! command -v python3 >/dev/null 2>&1; then if ! command -v pw-dump >/dev/null 2>&1 || ! command -v python3 >/dev/null 2>&1; then
return 1 return 1
fi fi
pw-dump | python3 - <<'PY' pw-dump | python3 -c '
import json import json
import sys import sys
@ -140,7 +159,7 @@ for obj in objs:
raise SystemExit(0) raise SystemExit(0)
raise SystemExit(1) raise SystemExit(1)
PY '
} }
capture_mode="alsa" capture_mode="alsa"
@ -208,13 +227,20 @@ case "${remote_capture_stack}" in
;; ;;
esac esac
resolved_video_size="$(resolve_video_size "${video_size}")"
printf 'using video mode: %s (%s)\n' "${resolved_video_size}" "${video_format:-driver-default}" >&2
video_args=(-f video4linux2 -framerate "${video_fps}" -video_size "${resolved_video_size}")
if [[ -n "${video_format}" ]]; then
video_args+=(-input_format "${video_format}")
fi
quiesce_for_alsa=0 quiesce_for_alsa=0
case "${remote_audio_quiesce_user_audio}" in case "${remote_audio_quiesce_user_audio}" in
1|true|yes) 1|true|yes)
quiesce_for_alsa=1 quiesce_for_alsa=1
;; ;;
auto) auto)
if [[ "${audio_mode}" == "alsa" ]]; then if [[ "${capture_mode}" == "alsa" ]]; then
quiesce_for_alsa=1 quiesce_for_alsa=1
fi fi
;; ;;
@ -305,14 +331,16 @@ if ssh ${SSH_OPTS} "${TETHYS_HOST}" "test -f '${REMOTE_CAPTURE}'"; then
ssh ${SSH_OPTS} "${TETHYS_HOST}" bash -s -- \ ssh ${SSH_OPTS} "${TETHYS_HOST}" bash -s -- \
"${REMOTE_CAPTURE}" \ "${REMOTE_CAPTURE}" \
"${remote_fetch_capture}" \ "${remote_fetch_capture}" \
"${VIDEO_FPS}" <<'REMOTE_NORMALIZE_SCRIPT' || normalize_status=$? "${VIDEO_FPS}" \
"${ANALYSIS_SCALE_WIDTH}" <<'REMOTE_NORMALIZE_SCRIPT' || normalize_status=$?
set -euo pipefail set -euo pipefail
src=$1 src=$1
dst=$2 dst=$2
fps=$3 fps=$3
scale_width=$4
ffmpeg -hide_banner -loglevel error -y \ ffmpeg -hide_banner -loglevel error -y \
-i "${src}" \ -i "${src}" \
-vf "fps=${fps}" \ -vf "fps=${fps},scale='min(${scale_width},iw)':-2" \
-c:v libx264 -preset ultrafast -crf 12 -g 1 -pix_fmt yuv420p \ -c:v libx264 -preset ultrafast -crf 12 -g 1 -pix_fmt yuv420p \
-c:a pcm_s16le \ -c:a pcm_s16le \
"${dst}" "${dst}"