Repository navigation
Render while capturing: each clip renders as soon as it's recorded, and a long batch waits for space instead of filling the drive (#861) - #885
Conversation
…between clips for space (#861) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…old while a take settles Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the whole machine Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…keep renders in the take index Review fixes for #885: - Record markers find their block by tick, so a skipped demo no longer shifts every later clip; no index panic in the hold watcher. - The planner only overcommits when each clip fits a drive on its own. - A held batch repeats BATCH_HELD and ends (game quits) once Studio has been gone 10 s; going on to the next demo needs no clock. - go resets the OBS stall clock; hold gaps don't widen the deadline. - The recording clip counts against the next only on the same drive. - A take that never settles is not handed over. - capture_clip_ready marks the block Captured and records the take before its render; batch-end verification counts rendered-and-deleted takes and keeps their render history. - A HUD pair's take is cleaned up once per pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Correctness reviewFixed in 101eda3, pushed to this branch: Clips matched to the wrong block. A panic that would close Studio. The hold watcher indexed The planner let a batch start that can never finish. The overcommit added the whole demo's estimate to every drive's free space. So a clip bigger than any drive was planned (the PR's own test asserted that), and the first clip is never checked at run time, so it recorded into the full drive. Now each block only has to fit on its own, on the earliest drive whose free space at planning time holds it plus the 15 GB ( A hold that never gets a
Going on to the next demo after a hold. That step needed the old demo's clock to still be active, or the demo was skipped with a OBS mode stopping right after a long hold. Once The clip being recorded counted against the next clip's drive. This happened even when the two clips go to different drives. It could Hold, or stop with CannotFit, a batch the planner had placed correctly, including with Keep. Now the clip only counts when both clips are on the same drive. A take that may still be written was handed over. Render While Capturing's renders and the take index. The take index only learned a batch's takes at
What changed:
A HUD pair checked twice. Both of a HUD pair's jobs finishing in one scheduler pass put the take into Checked and judged fine:
Not fixed, minor: after a resume, the footer keeps "Waiting for renders…" until the next progress line overwrites it, since Tests (local; this PR is stacked, so it gets no CI):
The test DLL in |
…use ds_capture_batch hold_command sent the old dodstudio_batch name, which the hook no longer registers since #719, so hold and go did nothing; it now uses runtime_batch::BATCH_COMMAND (with a test). Commands.txt: dev's file with this branch's hold|go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Brought up to date with #716 (unattended pass). Head
In game. DLL
🤖 Generated with Claude Code |
…uring-861 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
In-game check of the "Studio gone while held" path, POST: it works. DLL How the hook notices: What happened (hook log,
So the game doesn't stay open after the timeout: as A first run hit the "next demo" boundary instead: after the fast load this demo's clock starts at 397 (#893's gap), so my first batch file's times were all in the past. It held "before the next demo" and timed out the same way (Studio disconnected 16:29:55, batch ended 16:30:05, quit 16:30:10, Not tested: PRE; a real Studio (crash or close) mid-batch; and Screenshots: |
|
Heads-up from the #1025 (#952) review: git merges this PR and #1025 cleanly, but the build then fails. #1025 gives |
…render-while-capturing-861 capture_manager.rs: verify_capture_takes keeps dev's on_checked progress (#952) and this branch's rendered-while-capturing check; the #861 test passes a no-op callback; both sides' tests kept. render_manager.rs and settings_manager.rs: both sides' tests and asserts kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ew form from #644 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merged Conflicts: test modules in This PR is stacked on #716, so
🤖 Generated with Claude Code |
Conflicts: index.html keeps dev's move of "After a clip is finished" to Destinations (#1101), with Render while capturing left in Render Output; the builder's allocation keeps #885's one-at-a-time fallback and uses dev's no_room_message for both refusals (#1097). allocate_blocks_one_at_a_time now walks drives and reads each one's volume budget (#774), so with two capture folders on one disk it returns folder indexes, not volume indexes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merged dev in (237aa12). The two conflicts: "After a clip is finished" now lives in Destinations (#1101), with Render while capturing kept in Render Output; and both no-room refusals use #1097's plain message. Also fixed: |
…that Video mode plans at 2 B/px (#1103) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The hook's hold also stops at the fast-forward between two clips close together: with no seek between them, a hold asked for during clip 2 used to wait until after clip 3. - Start is no longer greyed out for a batch short of room that will hold between clips for renders (same test as capture_manager.rs). - The hold line stays on the Capture footer: it goes through the footer's own line, which redraws every second, instead of being overwritten by it. - The automatic finish step stays out of a batch that rendered while capturing (`rendered_while_capturing` on capture_takes_verified), instead of failing with "Nothing queued to render". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Live test: Render while capturing in Studio (2026-10-28, POST only, Brain account)Setup: Studio from this branch, run with its own copy of the settings so the real ones weren't touched (hash unchanged afterwards); test DLL
Fixed (bb03af1)
Local: workspace tests, clippy 1.98.1 (workspace, plus goldsrc-hooks for i686), fmt, 954 JS unit tests, 85 e2e tests (take-cleanup, finish-clips, capture-precheck, capture-progress, render-studio, app-boot). Not run:
Seen, not changed:
|
|
PRE: PASS (2026-10-28, same setup as run 4, |
Release note: New: "Render while capturing" (Configuration → Render Output, off by default) renders each clip as soon as the batch has recorded it. With takes set to be deleted, a long batch waits between clips for the renders to free room instead of filling the drive.
Stacked on #716 (
feat/auto-delete-takes-644), which isn't merged yet. This PR gets no CI until #716 merges and it retargets todev; local results are below. Before stacking, I mergeddevinto #716's branch (no conflicts) and pushed it. That brings in #854's merging of scans into a running queue, which this PR needs.Closes #861
Measurements
The full table is in #861 (comment).
Setup:
mirv_movie_fps 300.What the runs showed:
What it does
START_RECORDandSTOP_RECORDmarkers in the capture manifest's order.capture_clip_ready.render_while_capturing.jsthen queues and starts it through the Render tab's own queue, using the same codec and payload as the finish step (Finish clips automatically at the end of a capture batch (one video with audio per clip, no Render tab visit) #440,renderPayloadFor, factored out offinish_clips.js).-threads= cores ÷ the setting).make_roomdeletes the oldest finished takes.native::hlcr::capture_room, pure and tested). At everySTART_RECORD, it asks whether there is room for the clip being recorded plus the next clip plus 15 GB of headroom on the next clip's drive.dodstudio_batch holdand stops at the next clip boundary:BATCH_HELDgoes out on the events pipe;golets it carry on (BATCH_GOING).capture_enginesends the change over the game's pipe and tries again every second if a send fails.build_batch_queuestill gives a drive to blocks that don't fit now, instead of refusing the batch.PatcherConfig::render_while_capturingcontrols this.Decisions
devmerged into it first. Render tab: Scan for Takes works at any time, even while rendering, and merges into the queue (#772) #854's queue merge was needed. That merge had no conflicts, and native, studio and unit tests passed after it.game_probe.py, not a Studio batch. I sent HLAE commands at the same codec, resolution and frame rate as the capture settings. Driving the running Studio would have written into its configured WSOD25 export folders.hold/goare new arguments tododstudio_batch, so there is no name to add toconsole_commands_data.js.Commands.txtanddocs/dodstudio_commands.mdsay what the arguments do.Tests (local)
cargo test -p native -p desktop-studio: pass (native 768, studio 163). New tests:capture_room;builder/tests.rs;cargo test -p goldsrc-hooks --lib batch: 10 pass, including that a hold stops only at a clip boundary.-D warnings: clean on the workspace, and on goldsrc-hooks for both i686 and the host.cargo fmtis clean.npm run test:unit: 608 pass, 10 of them new inrender_while_capturing.test.js.finish-clips,take-cleanupandrender-studiospecs pass (66 tests).game_probe.pywith the test DLLlocal\test-861\dodstudio_goldsrc_hooks.dll), a 2-clip batch file onktps8w8-stealth_ih_saints_h1_p1:holdstopped it after clip 1's stop, before the seek. It stayed held for 10 s:BATCH_HELDarrived, the bare command reported "held between clips" and no seek ran.gosentBATCH_GOING, the seek ran, and the batch finished withBATCH_COMPLETE.Not tested
The whole loop in Studio has not been run: a real batch with the setting on, a render queued per clip, takes deleted mid-batch, and a hold and resume on a drive that is nearly full. To check by hand:
[render-while-capturing]lines.🤖 Generated with Claude Code