Repository navigation
v0.7.0
Strom 0.7.0 is a big release: 93 merged pull requests since 0.6.11, with the two 0.7.0 alphas in between. A lot has changed, so read through the list below before you upgrade, and test your flows on it before you take it on air.
Highlights
- Stinger transitions on the vision mixer: classic, track matte and mask only, with a clip library, cue and take, and example clips you can render from the panel (#1010).
- Live Recorder, a new recorder block where a quiet track holds nothing up, writing fragmented MP4, Matroska or MPEG-TS (#1034).
- HTML Input: render a web page as a source, and drive the page remotely (#879).
- Media Player plays live streams, extra tracks and URLs (#945), and media files can be downloaded from a URL, with upload progress (#1043).
- GPU paths: CUDA-memory inputs on the GPU vision mixer, NVDEC frames kept on the GPU, and GPU inputs in any pixel format (#948, #952, #1033).
- Audio: mixer and router inputs are resampled to one configurable sample rate (#946).
- WHIP and WHEP are much more robust: the WHIP Input fixes are consolidated (#957), with many follow-ups on sessions, slots and teardown, and the WHEP player recovers from a brief ICE drop (#1047).
- Vision mixer performance: idle FX slots in passthrough, no re-upload of unchanged overlays, cheaper meters and borders (#1003–#1007).
- Logins survive a restart: the login cookie is now signed (#947).
Thank you, @wagenet, for ten merged pull requests in this release, for the WHIP Input fixes consolidated in #957 (#759, #787, #893, #901, #943), for the stinger groundwork in #755, and for all the testing on real rigs. It made this release a lot better.
Full changelog
Features
- feat(auth): sign the login cookie so logins survive a restart by @srperens in #947
- feat(html): an HTML Input block, and remote control of the page it renders by @srperens in #879
- feat(live recorder): a recorder where a quiet track holds nothing up by @srperens in #1034
- feat(media): download a file from a URL, and stream uploads with progress by @srperens in #1043
- feat(mediaplayer): play live streams, extra tracks and URLs by @srperens in #945
- feat(vision mixer): change input labels while the flow runs by @srperens in #1014
- feat(vision-mixer): stinger transitions: classic, track matte and mask only by @srperens in #1010
Fixes
- fix(audio): resample mixer and router inputs to one configurable sample rate by @srperens in #946
- fix(audioenc): refuse an out-of-range bitrate instead of panicking by @srperens in #982
- fix(ci): pass gstcefsrc build inputs to the shell through env by @srperens in #980
- fix(docker): keep the CEF cache across a strom-full restart by @srperens in #979
- fix(frontend): draw cables for links without a pad name by @srperens in #1035
- fix(gst): keep NVDEC frames on the GPU into a GL input by @srperens in #952
- fix(gst): restore a streaming thread's priority when it leaves the flow by @srperens in #1046
- fix(mediaplayer): build file URIs that work on Windows by @srperens in #959
- fix(mediaplayer): drop a buffer with no PTS at the bridge by @srperens in #961
- fix(mediaplayer): hold typefind until a start from READY has returned by @srperens in #996
- fix(mediaplayer): start the internal pipeline on the flow's clock by @srperens in #984
- fix(mediaplayer): stop a burst of jumps and pauses deadlocking the player by @srperens in #986
- fix(mixer): clamp negative counts and live knee writes by @srperens in #904
- fix(mixer): stop group buses stacking the block latency on main by @srperens in #971
- fix(mixer): stop the monitor bus stacking the block latency by @wagenet in #920
- fix(mixers): stop a late first input rewinding a live aggregator by @wagenet in #895
- fix(pipeline): drop sink QoS events with Handled, not Drop by @srperens in #1011
- fix(thumbnail): adapt the thumbnail tap to CUDA memory on its tee by @srperens in #973
- fix(vision mixer): a restarted border frame is due on the mixer's next output by @srperens in #1038
- fix(vision mixer): adapt GPU inputs to any pixel format, converting only while needed by @srperens in #1033
- fix(vision mixer): keep a source's new shape when it changes size by @wagenet in #894
- fix(vision mixer): keep an Auto-format input on formats videocrop takes by @srperens in #925
- fix(vision mixer): key overlay registries by flow and block id by @srperens in #1015
- fix(vision mixer): multiview tally follows a cut on the same frame by @srperens in #1009
- fix(vision mixer): no border underlay restart holds a source while the flow stops by @srperens in #1031
- fix(vision mixer): the PGM compositor no longer waits on the multiview to allocate (CPU) by @srperens in #1029
- fix(vision_mixer): accept CUDA-memory inputs on the GPU backend by @srperens in #948
- fix(whep player): recover from a brief ICE drop and end the session on an early Disconnect by @srperens in #1047
- fix(whep): re-adapt the WHEP Output video input when its caps change by @srperens in #985
- fix(whep): unhide player audio controls; expose Location cross-origin by @wagenet in #811
- fix(whip): consolidate the WHIP Input fixes from #759, #893, #787, #901 and #943 by @srperens in #957
- fix(whip): flush a released slot's appsrc so a new session gets none of the old one's frames by @srperens in #1028
- fix(whip): give a POST's session back on every error path by @srperens in #987
- fix(whip): judge a seat's audio and video separately by @srperens in #983
- fix(whip): judge a session by the media it produces, not what arrives by @wagenet in #756
- fix(whip): link a session pad only after its branch is PLAYING by @srperens in #976
- fix(whip): null a session bin whipserversrc removes mid-teardown by @wagenet in #763
- fix(whip): release only a slot the releasing session still holds by @srperens in #972
- fix(windows): give blocks a media path without the verbatim prefix by @srperens in #1045
Performance
- perf(mixer): stop bus mixers re-querying latency while a channel is unfed by @srperens in #1003
- perf(vision mixer): meter audio without a queue thread or a sink by @srperens in #1006
- perf(vision mixer): run idle FX slots in passthrough by @srperens in #1007
- perf(vision mixer): static border underlays, no frame for unconfigured borders by @srperens in #1005
- perf(vision mixer): stop re-uploading an unchanged overlay, cap meter redraws at 4 fps by @srperens in #1004
- perf(whep): convert a video input once, not once per viewer by @srperens in #949
Refactoring
- refactor(frontend): replace local API type copies with strom-types by @wagenet in #915
- refactor(gst): decide video input adapters in one place, and write down the block contract by @srperens in #951
Tests
- test(aes67): read drop-on-latency after the block's handler, not by polling by @srperens in #923
- test(api): keep API and MCP test state in a temp dir by @srperens in #905
- test(auth): cover auth_middleware, and accept a percent-encoded ?auth_token= by @srperens in #908
- test(efp): guard an empty data_stream_ids in the EFP/SRT input by @srperens in #978
- test(frontend): cover graph pad-name helpers, fix two request-pad bugs by @srperens in #911
- test(gl): do not build the GL bridge test on Windows by @srperens in #954
- test(gl): fail instead of skipping when the GPU mixer breaks by @wagenet in #917
- test(gl): run the GPU vision mixer GL tests on Linux CI by @srperens in #977
- test(liveaudiorouter): wait for PLAYING before connecting a late input by @srperens in #958
- test(mediaplayer): align bridge timing slack with the re-sync threshold by @srperens in #991
- test(mixer): count a free bus's quiet intervals from its first audible one by @srperens in #1039
- test(mixer): guard that a channel keeps feeding every bus while one bus waits by @srperens in #1008
- test(mixer): link a late test input fully before it can start by @srperens in #1041
- test(mixer): replace low-value tests with builder topology guards by @srperens in #909
- test(mixers): wait on the output in the late-first-input rewind test by @srperens in #988
- test(recorder): wait for progress instead of a fixed window in the stall tests by @srperens in #995
- test(vision mixer): run the letterbox wipe test where the runner keeps real time by @srperens in #1027
- test(vision mixer): the tally guard checks lag, not lead by @srperens in #1018
- test(vision mixer): wait for the program background before keying the DSK in by @srperens in #981
- test(vision mixer): wait out the underlays' start-up frame before measuring by @srperens in #1026
- test(vision_mixer): register the cudadownload stand-in once, never remove it by @srperens in #950
- test(whip): make the per-poll watchdog guard independent of scheduler latency by @srperens in #975
- test(windows): run the two SRT integration tests on Windows again by @srperens in #929
- test: consolidate the integration tests and share their helpers by @srperens in #912
- test: ignore the flaky Monitor queue guard on Linux, wait for FX end-of-take by @srperens in #1012
- test: make backend unit tests guard real code, prune the rest by @srperens in #910
- test: replace two demonstration tests with guards on the real blocks by @srperens in #907
- test: stop waiting out fixed windows the tests do not need by @srperens in #1000
Build, CI and docs
- build(docker): install gsettings-desktop-schemas explicitly by @srperens in #1048
- build: bump Rust to 1.98.1 and cargo-zigbuild to 0.23.4 by @wagenet in #941
- chore(release): bump version to 0.7.0 by @srperens in #1049
- chore(release): bump version to 0.7.0-alpha1 by @srperens in #960
- chore(release): bump version to 0.7.0-alpha2 by @srperens in #970
- ci: probe a write in the sccache preflight, add a concurrency group by @srperens in #989
- ci: run every macOS/Windows test binary with --no-fail-fast by @srperens in #1016
- ci: stop compiling the tree three times on macOS/Windows PRs; drop NVML on macOS by @srperens in #990
- docs(pr): make the PR template ask for claims and their evidence by @wagenet in #853
- docs: catch up with the code, and add AGENTS.md by @srperens in #1019
- Update trunk installation command to use --locked by @srperens in #940
Full Changelog: v0.6.11...v0.7.0