Repository navigation
First stable release. Streaming now holds up end to end: low latency, clean quality across screen changes, and sessions that no longer stall after ~10 minutes. This release adds loss recovery by retransmit, resolution that follows the link, and a still screen that always ends on the current picture.
Added
Nackcontrol message (renderd.proto): the viewer asks the host to resend specific lost fragments. Backward-compatible, so a minor bump.
Performance
- Lost fragments are resent, not paid for with a keyframe. A lost fragment used to go
unnoticed until four incomplete frames had piled up (on a mostly clean link, never) while the
frames after it were decoded against a reference the decoder never got, smearing the picture
until the next keyframe, which on a 3 Mbps link is a quarter of a second of link time. The
viewer's newReceiveWindowhands frames to the decoder strictly in order, notices a missing
fragment as soon as anything after it arrives, and asks for exactly those fragments in a new
Nackmessage; the host answers from the last second of datagrams it keeps, and resends the
newest frame's last datagram after 100 ms of quiet so a lost tail is noticed too. Only a frame
still missing two round trips plus 120 ms later costs a keyframe, and nothing that depends on
it is decoded meanwhile. Over loopback QUIC with 5% loss every frame arrives in order with no
keyframe request. (renderd-frame::receive,
host::network::retransmit) - Bitrate steers on real packet loss. The ABR loop used the viewer's frame-loss rate per
100 ms report (one lost frame among six read as 14%, two as 25%), which walked the bitrate
down to the floor on any Wi-Fi link. The host now reads QUIC's own packet-loss counters over the
last second; loss aboveabr.loss_thresholdonly stops probing, and the bitrate is cut at five
times that (or on queuing delay, as before). A 4 Mbps link with 1-3% random loss now holds
3 Mbps in simulation instead of sinking to 1.5. - Encoded resolution follows the link. With the default 10 Mbps ceiling a 3 Mbps link still
got 1080p, and at 2 Mbps a full-screen change of 1080p text is an 83 KB frame (a third of a
second) against 25 KB at 544p, and noVideoToolboxsetting bounds it with low-latency rate
control. The host now steps the encoder down to 896, 720 or 544 lines when the bitrate falls
below 75% of what the size needs for 2 s, and back up a rung after 8 s of room, without
touching capture (VideoToolboxscales). The viewer follows from the stream. On by default;
host.adaptive_resolution = falseturns it off. (host::scale) - A still screen ends on the current picture. After a big change the low-latency rate
controller drops the frames that follow it (six of eight in a 2 Mbps measurement), so a scroll
that stopped inside that window left the viewer on a stale frame until the next change. The
host now re-encodes the newest captured surface after 60 ms of stillness until two passes come
out of the encoder. (host::refine) - HEVC on Windows where the GPU decodes it.
--codec autonow offers HEVC first when the GPU
has the HEVC Main profile and the Media Foundation HEVC decoder runs on it, H.264 otherwise. - Frames are presented on arrival. The viewer presented through
request_redraw, which on
Windows is a WM_PAINT, the lowest-priority message. It now presents from the wake itself, and
connects atnetwork.quic_mtuinstead of QUIC's 1200-byte minimum.
Fixed
- Keyframe loop on slow links. Frames held up on the wire behind a large one arrive together
and span more than the 150 ms backlog threshold; the viewer took that for decode falling behind,
skipped them and asked for another keyframe, which bunched the next frames the same way. A pass
now only counts as a backlog if the previous one spent 50 ms or more decoding. - Capture rate at session start. The first vsync report rebuilt the
ScreenCaptureKit
pipeline at every session start and replaced the negotiated frame rate with the viewer's
refresh rate, lifting a 30 fps session to 60. Vsync now only slows capture, and the rebuild runs
off the async workers.
Documentation
- README: refreshed status banner, Windows viewer description (DXVA decode, D3D11 presenter,
Nackrecovery), roadmap and release history. release.yml: the release-notes extraction used an awk regex that failed on the tag name, sov0.9.2andv0.10.0built but never published. It now matches the heading as a literal string.