Skip to content

v0.7.0

Choose a tag to compare

@srperens srperens released this 08 Oct 10:40
· 101 commits to main since this release
8955cde

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