Skip to content

Render Settings: save clips as ProRes 422 (new default), LT or 4444 beside HQ - #1049

Merged
ccoventry merged 2 commits into
devfrom
feat/prores-profiles
Oct 26, 2026
Merged

ccoventry merged 2 commits into
devfrom
feat/prores-profiles

Conversation

@ccoventry

@ccoventry ccoventry commented Oct 26, 2026 •

Copy link
Copy Markdown
Owner

Release note: New: Render Settings can save clips as ProRes 422 (about 2/3 the size of HQ, now the default for new installs), ProRes 422 LT (about half) or ProRes 4444 (full colour detail, about 1.5x), with a line under the Codec picker saying what each is for. Existing settings keep their codec.

What changed

  • Three new Render codecs beside ProRes 422 HQ, in Render Settings' Codec picker and in the three "When a batch finishes" pickers. ProRes 422 is listed first:

    Choice Saved as FFmpeg Container
    ProRes 422 (2/3 the size of HQ), default for new installs prores_422 prores_ks -profile:v standard -pix_fmt yuv422p10le .mov
    ProRes 422 HQ prores -profile:v hq -pix_fmt yuv422p10le .mov
    ProRes 422 LT (half the size of HQ) prores_lt -profile:v lt -pix_fmt yuv422p10le .mov
    ProRes 4444 (1.5x the size of HQ) prores_4444 -profile:v 4444 -pix_fmt yuv444p10le (no alpha) .mov
  • Default for new installs is ProRes 422; saved settings keep theirs. "render_codec": "prores" in an existing settings file, preset or autosave still means HQ (RenderCodec::ProRes keeps its name and id), and any other saved codec stays as it is. Only a missing or empty value gets 422: default_render_codec() (serde default and fresh AppSettings), RenderConfig::default(), RenderCodec::from_str_id's fallback for an empty or unknown id, and the JS fallbacks (render_pane.js, settings_sync.js, finish_clips.js, render_presets.js). No settings migration: nobody's existing renders change size without choosing to.

  • HQ's -profile:v 3 is now written hq: the same profile. The HUD stream is untouched: always ProRes 4444 with alpha, whichever ProRes is picked.

  • A one-line hint under the Codec picker (studio/src/codec_hint.js) that changes with the selection, for the four ProRes choices only:

    • 422: "Recommended for most videos: looks the same as HQ in our tests, about 2/3 the size."
    • HQ: "Looks the same as the capture; the largest of the three 422 choices, for when file size is no concern."
    • LT: "About half the size of HQ. Fine for game footage; a little more detail is lost in fast motion and fine textures."
    • 4444: "Full colour detail, about 1.5x the size of HQ. Only worth it for heavy colour grading or small coloured text drawn into the picture. No transparency: the separate HUD stream always has its own."
  • Space reservation: each profile learns its own bytes per frame (its own RateKey). Until one has finished a render at a frame size, it borrows another ProRes profile's measured rate through their size ratios (HQ 1.0, 422 0.67, LT 0.47, 4444 1.5, in RenderCodec::prores_profile) instead of falling back to the raw-frame estimate. Other codecs and the HUD stream don't borrow.

  • Combine Clips now also compares the codec tag (apch/apcn/apcs/ap4h), so HQ and 422 clips, which share codec and pixel format, are re-encoded rather than stream-copied into one file that would label every frame with the first clip's profile. This matters more now that new installs render 422 and older clips are HQ.

  • docs/features.md: the codec table (422 as default) and a paragraph on which ProRes to pick.

Measurements

300 fps 2560x1440 capture (local\review-images\prores-compare\), one recorder (m00cat), one clip:

Profile Size vs HQ VMAF vs lossless
HQ 100% (0.51 GB/s) 99.3
422 67% 98.6
LT 47% 97.2
4444 147% (re-encoded from the HQ file, so slightly low) not measured

No visible difference at 3x zoom between HQ, 422 and LT. Apple's target rates give the same ratios (147/220 = 0.67, 102/220 = 0.46, 330/220 = 1.5). On a generated testsrc2 2560x1440 Ut Video clip the ratios were 0.74 / 0.58 / 1.39: synthetic footage, so the defaults follow the real capture.

Tests

  • New: config::tests::old_prores_values_still_mean_hq, each_prores_choice_has_its_own_profile, test_from_str_id_unrecognized_falls_back_to_prores_422 (also empty id and RenderConfig::default), the string-id and serde round trip over every codec; settings_manager::tests::a_fresh_install_renders_prores_422_and_a_saved_codec_stays and the legacy-file test (no render_codec → 422); renderer::tests::each_prores_choice_renders_with_its_own_profile (FFmpeg args per profile), a_prores_profile_borrows_another_profiles_rate_until_it_has_its_own; combine::tests HQ vs 422 not stream-copied; codec_hint.test.js; JS fallbacks in finish_clips.test.js and render_presets.test.js; an e2e check in render-studio.spec.js that 422 is first, the hint follows the picker and HQ's hint no longer says "default".
  • New, #[ignore]d (needs FFmpeg): renderer::tests::prores_choices_render_with_their_profile generates a 2560x1440 300 fps Ut Video take with a wav, renders it through run_render_job with each ProRes choice, and checks ffprobe's profile= (HQ / Standard / LT / 4444). Run locally with DOD_FFMPEG=<ffmpeg.exe>: passed, all four profiles as expected.
  • cargo test --locked --workspace, rustup run 1.98.1 cargo clippy --workspace --all-targets -- -D warnings, rustup run 1.98.1 cargo fmt --all --check: all pass (no failures; clippy clean).
  • npm run test:unit: 914 passed. e2e render-studio, finish-clips, render-presets, app-boot: 71 passed.

Other open PRs touching the same files

#716 (renderer.rs, render_manager.rs, index.html, strings.js, features.md), #874 (index.html, strings.js, features.md), #881 and #832 (strings.js, features.md), #879, #760, #425 (strings.js). None touch the codec lines.

Decisions

  • Option labels stay short with the size next to HQ; the longer advice is in the hint, not the label, so the capture summary's "Finish: …" line stays readable.
  • ProRes 422 is the default for new installs and the first option (the user's pick); existing settings are not migrated.
  • An empty or unknown codec id falls back to 422 too, the same as a missing one.
  • The ids are prores_422, prores_lt, prores_4444.

🤖 Generated with Claude Code

Three new main-video codecs (prores_422, prores_lt, prores_4444); prores stays HQ. Each profile learns its own size rate and borrows another profile's through their size ratio until it has one. A hint under the Codec picker says what each ProRes choice is for. Combine Clips compares the codec tag so mixed ProRes profiles are re-encoded, not stream-copied.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Listed first in the Codec and finish-clips pickers. A missing or empty codec defaults to 422; a saved prores stays HQ and any other saved codec stays as it is. HQ's hint no longer calls it the default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ccoventry ccoventry changed the title Render Settings: save clips as ProRes 422 or LT, a third and half smaller than HQ, or as ProRes 4444 Render Settings: save clips as ProRes 422 (new default), LT or 4444 beside HQ Oct 26, 2026
@ccoventry
ccoventry merged commit 665bf19 into dev Oct 26, 2026
5 checks passed
@ccoventry
ccoventry deleted the feat/prores-profiles branch October 26, 2026 07:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant