The native GStreamer screen share path is gone: in a peer-to-peer mesh every
hardware and OS combination behaved differently, and keeping them in step cost
more than it saved. Screen sharing uses Chromium's own capture everywhere.
- Screen share bitrate is a setting: a stepper from 300 to 10,000 Kbps or
unlimited, with press-and-hold repeat and typed entry. Changes apply live,
including to a share going through the voice relay (debounced, so a hold
becomes one update). The default stays 1080p at 30 fps with an 8,000 Kbps cap.
- Black screen share tiles on GPU encoders: the sharer asks for a fresh
keyframe after negotiation, and the watchdog only re-adopts tracks a tile is
not already showing.
- Relay screen publishing is serialized and tied to the share it was started
for, so a stop, a new share or a relay restart can never publish a stale
producer, and a failed first publish retries on its own.
Two setups confirmed that the "Gentler screen share for relay
connections" toggle is what a relayed share needs. Nobody should have to
know what a TURN server is to get it, so once a peer connection settles,
its selected candidate pair is checked: if either end is a relay
candidate, that viewer's sender gets the gentler encoder settings, while
viewers on a direct route in the same call keep the full-quality share.
Re-checked on every (re)connect since an ICE restart can move a call on
or off the relay. On by default; a switch under Settings, Debug turns the
detection off, and the manual toggle still forces the profile for all.
Suggested by RCCore after confirming the profile on a UDP relay and a
clean WAN peer.