Dual Format: verify dual-canvas passthrough + fix EB/VOD save-before-launch#28
Merged
Merged
Conversation
Soulhackzlol
force-pushed
the
dual-format-verify-and-vod-eb-fix
branch
from
June 26, 2026 13:11
801711b to
4853210
Compare
Dual Format (horizontal + vertical canvas over one Enhanced Broadcasting RTMP connection) already works through the proxy with no code changes: canvas_index lives only in the GetClientConfiguration JSON, and on the wire the vertical canvas is just additional TrackIds that the existing pass_through_multitrack path forwards bit-faithfully. Verified in production against real Twitch (landscape x4 + portrait x3, HEVC vertical primary, cuts stable). Add regression tests pinning the behavior: - forwards both canvases to Twitch - keeps horizontal, drops vertical for non-Twitch - documents that cuts anchor to the horizontal canvas (the one invariant a future canvas-aware cut would have to revisit) Bump test count 197 -> 200 (EN + ES).
The "Launch OBS for EB + VOD" button's visibility is driven by the live VOD checkbox, but VOD only takes effect on save: saving is what writes OBS's EnableCustomServerVodTrack gate (user.ini) and flips InstantClone's VOD-track forwarding. Clicking Launch on unsaved state spawned OBS with EB but no VOD - a silent mismatch. launchObsWithEb() now persists the form first and only launches if the save succeeded; saveDestForm() returns a success boolean for that gate.
Soulhackzlol
force-pushed
the
dual-format-verify-and-vod-eb-fix
branch
from
June 26, 2026 13:14
4853210 to
628008e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Two related pieces of work that came out of investigating Twitch Dual Format (vertical video) support, tracked in #27.
1. Dual Format already works — add regression tests (
test:commit)Dual Format sends a horizontal + vertical canvas over one Enhanced Broadcasting RTMP connection. It turned out to need no production code changes:
canvas_indexlives only in theGetClientConfigurationJSON, and on the wire the vertical canvas is just additionalTrackIds that the existingpass_through_multitrackpath already forwards bit-faithfully.Verified in production against real Twitch: landscape ×4 + portrait ×3 tracks received, HEVC vertical primary, multiple delay cuts stable, dashboard reported "Excellent". Also confirmed it composes with VOD audio + EB (separate
pass_through_multitrack_audioflag).New tests in
src/h264.rs:select_video_bytes_forwards_dual_canvas_to_twitchselect_video_bytes_keeps_horizontal_drops_vertical_for_non_twitchis_primary_video_idr_anchors_dual_format_cuts_to_horizontal_canvas— pins the one invariant (cuts anchor to the horizontal canvas) that a future canvas-aware cut would have to revisit.Test count bumped 197 → 200 (EN + ES READMEs).
2. Fix EB/VOD save-before-launch footgun (
fix:commit)The "Launch OBS for EB + VOD" button's visibility is driven by the live VOD checkbox, but VOD only takes effect on save — saving is what writes OBS's
EnableCustomServerVodTrackgate (user.ini) and flips InstantClone's VOD-track forwarding. Clicking Launch on unsaved state spawned OBS with EB but no VOD, a silent mismatch.launchObsWithEb()now persists the form first and only launches if the save succeeded;saveDestForm()returns a success boolean for that gate.Testing
cargo test --release→ 200 passed, 0 failedcargo fmt --checkclean,cargo clippy --release --all-targetscleanCloses #27.