Skip to main content

Kyber 0.19.0

· 3 min read

Kyber 0.19.0 brings meaningful improvements to streaming quality, session observability, and platform robustness. The most impactful user-facing addition is dynamic bitrate control: the streaming bitrate can now be adjusted at runtime without reconnecting, and the web client exposes this through a live bitrate control API. The default minimum video bitrate is set to 5 Mbps, with a configurable floor for deployments that need it lower. Both audio and video buffer sizes are now tunable via command-line options (--audio-buffer and --video-buffer) on the desktop, and exposed through the JavaScript API on the web, giving users direct control over the latency-versus-smoothness trade-off.

Session tracing improves significantly: the server now generates a unique Session ID at the start of each stream, logs it, and sends it to the client. The client logs this ID upon receiving it, making it straightforward to correlate server and client logs for a specific session when diagnosing issues. The QUIC transport layer now filters out duplicate frames in the GopStream protocol, preventing redundant data from reaching the decoder.

On Windows, the capture and encoding server implements a monotonic clock, avoiding timestamp issues caused by non-monotonic system clock sources. The clock source used by the stream processing pipeline is now configurable from kyber_config.toml. The NVENC encoder now correctly sets the GOP size when intra-refresh is disabled. The QUIC transport automatically finds an available IPC port at startup instead of requiring manual configuration. The input handling C API gains rumble unpack support and includes vendor and product IDs in gamepad plug packets, enabling more precise gamepad identification. The web client fixes cases where mouse position events were incorrectly sent instead of relative mouse move events, and adds Client.disconnect_and_stop() for cleaner teardown from JavaScript. Gamepad plug and unplug notifications are now exposed through the JavaScript API, and audio initialization is skipped gracefully when SharedArrayBuffer is unavailable in the browser context.

Changelog

  • avserver/win32: Implement monotonic clock
  • windows_service: Correctly log CreateProcessAsUserW() error
  • kymux: Try to find an available port when starting IPC
  • kyaudioreg: Fix compensation
  • desktop: Add --audio-buffer parameter
  • controller: Remove timeout on avserver kill
  • libclient/rtp: Allow to override the SDP folder with envvar KYBER_CACHEDIR
  • libkynput: Add SDL2 feature to be able to trigger SDL2 support
  • libkynput/capi: Add rumble unpack
  • libkynput/capi: Add vendor/product id in libkynput_gamepad_plug_to_packet()
  • txproto: Rebase to upstream/master
  • desktop: Bitrate can now changed dynamically during runtime
  • avservice: Allow to configure txproto clock source from kyber_config.toml
  • kyaudioreg: Rework underflow log
  • desktop: Add video-buffer option
  • avservice: By default, the video bitrate can't be set under 5 mbps
  • avservice: Allow to configure the minimum allowed video bitrate
  • avservice/nvenc: Set GOP when intrarefresh is disabled
  • controller: Generate, log and send a SessionId on streaming start
  • libclient: Log SessionId sent by controller on streaming start
  • kymux: Filter out duplicates in GopStream
  • (web) jsapi: Add audio_buffer parameter
  • (web) kyproto/kyaudioreg/libclient: Use kywasmtime
  • (web) jsapi: Add live bitrate control
  • (web) libclient: Skip audio initialization if SharedArrayBuffer isn't defined
  • (web) kyaudioreg: Rework underflow log
  • (web) jsapi: Add video_buffer option
  • (web) kymux: Filter out duplicates in GopStream
  • (web) libclient: Log SessionId sent by controller on streaming start
  • (web) jsapi: Expose gamepad plug/unplug notifications
  • (web) inputs: Fix cases where MousePosition where sent instead of MouseMove
  • (web) jsapi: Add Client.disconnect_and_stop() to both disconnect and stop the Client