From 2aa4a27f9fef011067040ffc6de2e5388145cfa9 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Sat, 25 Apr 2026 04:51:09 -0300 Subject: [PATCH] test(sync): auto-select theia host capture mode --- scripts/manual/run_upstream_av_sync.sh | 48 ++++++++++++++++++++------ 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/scripts/manual/run_upstream_av_sync.sh b/scripts/manual/run_upstream_av_sync.sh index edace6c..ef331de 100755 --- a/scripts/manual/run_upstream_av_sync.sh +++ b/scripts/manual/run_upstream_av_sync.sh @@ -18,13 +18,14 @@ TAIL_SECONDS=${TAIL_SECONDS:-2} 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} 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_FORMAT=${VIDEO_FORMAT:-mjpeg} REMOTE_CAPTURE_STACK=${REMOTE_CAPTURE_STACK:-auto} REMOTE_AUDIO_SOURCE=${REMOTE_AUDIO_SOURCE:-auto} REMOTE_AUDIO_QUIESCE_USER_AUDIO=${REMOTE_AUDIO_QUIESCE_USER_AUDIO:-auto} ANALYSIS_NORMALIZE=${ANALYSIS_NORMALIZE:-1} +ANALYSIS_SCALE_WIDTH=${ANALYSIS_SCALE_WIDTH:-1280} SSH_OPTS=${SSH_OPTS:-"-o BatchMode=yes -o ConnectTimeout=5"} LOCAL_AUDIO_SANITY=${LOCAL_AUDIO_SANITY:-1} PROBE_PREBUILD=${PROBE_PREBUILD:-1} @@ -78,10 +79,6 @@ remote_audio_source=$7 remote_audio_quiesce_user_audio=$8 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() { 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() { if ! command -v pw-dump >/dev/null 2>&1 || ! command -v python3 >/dev/null 2>&1; then return 1 fi - pw-dump | python3 - <<'PY' + pw-dump | python3 -c ' import json import sys @@ -140,7 +159,7 @@ for obj in objs: raise SystemExit(0) raise SystemExit(1) -PY +' } capture_mode="alsa" @@ -208,13 +227,20 @@ case "${remote_capture_stack}" in ;; 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 case "${remote_audio_quiesce_user_audio}" in 1|true|yes) quiesce_for_alsa=1 ;; auto) - if [[ "${audio_mode}" == "alsa" ]]; then + if [[ "${capture_mode}" == "alsa" ]]; then quiesce_for_alsa=1 fi ;; @@ -305,14 +331,16 @@ if ssh ${SSH_OPTS} "${TETHYS_HOST}" "test -f '${REMOTE_CAPTURE}'"; then ssh ${SSH_OPTS} "${TETHYS_HOST}" bash -s -- \ "${REMOTE_CAPTURE}" \ "${remote_fetch_capture}" \ - "${VIDEO_FPS}" <<'REMOTE_NORMALIZE_SCRIPT' || normalize_status=$? + "${VIDEO_FPS}" \ + "${ANALYSIS_SCALE_WIDTH}" <<'REMOTE_NORMALIZE_SCRIPT' || normalize_status=$? set -euo pipefail src=$1 dst=$2 fps=$3 +scale_width=$4 ffmpeg -hide_banner -loglevel error -y \ -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:a pcm_s16le \ "${dst}"