-
released this
2026-05-26 15:20:25 +00:00 | 72 commits to main since this releaseWhen
sequential → exhaustiveadaptive-retry exhausts itself (retry_hint=None), the pipeline now automatically binary-subdivides the source video, probes each leaf clip with a cheap preprocess+SfM-only run, and combines the surviving leaves through the existing multi-video path. Automates the manual 4-clip workflow that rescuedmax_strassein v1.3.0 — no new command, no new flag, just a longer run when the matcher swap isn't enough.Added
- Auto-bisection-rescue — third escalation in
run_pipeline_with_adaptive_retry, gated onretry_hint=None, single-video input, andcfg.retry.bisect_enabled(defaulttrue). - New module
src/autosplat/bisection.py—BisectionClipfrozen dataclass,build_ffmpeg_cut_command+cut_video(stream-copy, no re-encode),probe_clip(forcescolmap.matcher=exhaustivebecause sequential is unreliable on shorts),bisect_recursively(DFS halt-on-success-per-branch), andrescue_via_bisectionorchestrator. - Three new
[retry]config fields with conservative defaults:bisect_enabled=true,bisect_min_clip_s=60.0(range 10–600),bisect_max_depth=3(range 1–6 — depth 3 = ≤ 8 leaves). Disablebisect_enabledfor fast-fail in CI. - Bisection artefacts persist under
<capture_dir>/rescue/clips/<stem>_part_<clip_id>.mp4(physical sub-clips) and<capture_dir>/rescue/probes/<clip_id>/{frames,colmap}(per-clip SfM workspace) so a partial run is debuggable.clip_idis depth-encoded (0,0_1,0_1_0) — leading digit is the first/second half, deeper underscores trace each recursion step. - 20 new tests in
tests/test_bisection.py+ 4 intests/test_pipeline.py. Two opt-in real-binary integration tests sit behindAUTOSPLAT_BISECTION_E2E=1plus the existingneeds_ffmpeg/needs_colmapmarkers. Total 293 unit tests passing (uv run pytest -q, up from 265 in v1.3.0). - Docs:
CAPTURE-GUIDE.mdgains an "Auto-bisection internals (v1.4+)" section with the rescue/ layout andclip_idsemantics;CONFIGURATION.md[retry]table grows three rows;TROUBLESHOOTING.mdreplaces the old "if exhaustive also fails, you're stuck" branch with the actual escalation path and structured log events to watch for.
Fixed
bisect_recursivelyper-branch ffmpeg resilience —cut_videoraisingsubprocess.CalledProcessErroron a corrupt sub-range (broken keyframe, container quirk) is now caught, logged asbisection.cut_aborted_branch, and treated as a failed probe; the sibling branch still runs. Previously the whole rescue would abort with a rawCalledProcessError.read_source_video_from_lognow returns the most recentpipeline.start— after bisection appends a freshpipeline.startwith the leaf-clip list,autosplat resumeandautosplat add-videoon a bisected capture see the current state (the leaves) instead of silently re-feeding the original failed input. Pre-v1.4 captures with only one start event behave identically.
Design Notes
- Why a separate module?
pipeline.pywas already 600 LOC; bisection's ~330 LOC of recursion + ffmpeg-cut + probe logic gets isolated inbisection.pyand exposes only the orchestrator topipeline.py. Each unit is testable without the others (the recursion is monkeypatch-friendly via the_probe_fninjection point). - Why no WebUI per-clip progress in v1.4? Bisection runs inside the existing
sfmstage from the state-machine's perspective; events surface via structured logs only. A WebUIbisect_probestage with per-clip progress is a v1.4.1 candidate. - Why no standalone
autosplat rescuecommand? The user-chosen trigger is the auto-escalation path — a normalautosplat process …just keeps running. A standalone command can be added in v1.4.1 if the auto-path proves clumsy. - Why no smart-split? Midpoint binary cuts are the v1.4 strategy. Smart-split at motion-change (OpenCV optical flow) is a v1.4.1 candidate and would only help when the rotation event is concentrated rather than smeared across the clip.
Follow-ups (resolved post-v1.4.0)
Probe-stage compute cost (250 frames × exhaustive matcher)→ resolved in v1.4.1 via[retry] bisect_probe_target_frames=120(~4× faster probes).No real-world smoke against a non-trivial structurally-failing capture→ resolved in v1.4.4 with themax_strasse.MP4end-to-end run: 490/493 cameras (99.4 %), 2.0 GB scene.ply, 5 h 36 min on M5. Fly-through video.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Auto-bisection-rescue — third escalation in