Skip to content

Releases: BechsteinDigital/callora-voip-sdk

v4.6.0-preview.2 — STUN/TURN server, WebRTC RTCP quality & SIP compliance

Choose a tag to compare

@BechsteinDigital BechsteinDigital released this 22 Jul 09:58
ac5a14d

v4.6.0-preview.2

A large RFC-compliance and hardening release on top of the preview.1 WebRTC facade —
145 source files changed (~9.9k insertions) across ~50 PRs since v4.6.0-preview.1.
No breaking API changes.

✨ Added

  • Self-hostable STUN & TURN serverAddCalloraStunServer(...) / AddCalloraTurnServer(...)
    with TURN control over UDP/TCP/TLS (end-to-end covered), inbound FINGERPRINT validation on both
    servers, DONT-FRAGMENT on the relay socket, and EVEN-PORT + RESERVATION-TOKEN (RFC 8656 §7).
  • TURN relay lifecycle (RFC 8656 §9/§12) — permission-refresh and channel-rebind keepalive
    loops that hold a real allocation alive across more than one lifetime (CF-003).
  • RTCP quality on the WebRTC/BUNDLE media path (RFC 3550, CF-004a–g) — periodic Sender/Receiver
    Reports, per-SSRC reception statistics, RTT from RR/SR, report-block paging (no overflow loss),
    negotiated-clock-rate §A.8 jitter with NTP↔RTP SR extrapolation, and per-SSRC/MID quality
    snapshots on WebRtcStats (JitterMs et al.); verified two-peer over real DTLS-SRTCP.
  • DTMF (RFC 4733) end-to-end on the WebRTC/BUNDLE path (CF-007).
  • SHA-512-256 SIP digest auth (RFC 8760, CF-001) resolving a multi-challenge deadlock; digest
    qop=auth-int (RFC 7616, CF-067a); RFC 5626 outbound ;ob contact parameter (CF-067b).
  • THIRD-PARTY-NOTICES.md — license attribution for all runtime dependencies.

v4.6.0-preview.1 — WebRTC facade (preview) & Voip* config rename

Choose a tag to compare

@BechsteinDigital BechsteinDigital released this 18 Jul 14:47

⚠️ Pre-release. Ships the new WebRTC facade as a preview: it has not yet been
validated against real browsers (Chrome/Firefox) and its API may still change before it is
declared stable. The SIP stack (VoipClient) is unchanged and production-ready.

✨ Highlights

Public WebRTC facade (preview, transport-only) — a signalling-neutral browser/peer surface
in the CalloraVoipSdk.WebRtc namespace, mirroring the four-level design of VoipClient. The app
owns signalling and the codec; the SDK runs ICE, DTLS-SRTP, BUNDLE and RTP/RTCP and moves bytes —
it never encodes or decodes.

  • WebRtcClient / IWebRtcClientnew WebRtcClient() or DI via AddCalloraWebRtc(...);
    CreatePeer() returns an IPeerConnection.
  • Signalling happy pathpeer.ConnectAsync(IWebRtcSignaling, WebRtcRole) drives the full
    RFC 8829 offer/answer over your channel and completes when connected (the WebRTC counterpart to
    DialAndWaitUntilConnectedAsync). Neutral primitives (CreateOffer / SetRemoteDescriptionAsync
    / StartAsync) remain for manual control.
  • W3C track modelTrackReceivedRemoteTrack (Kind, StreamId = remote a=msid,
    TrackId) with EncodedFrame (payload, RTP timestamp, key-frame flag).
  • Multi-peer managerIWebRtcClient.Peers.
  • L3 extension seamsIMediaTap + AttachMediaTap (in/out media for recording/analytics/AI);
    IWebRtcClientModule + IWebRtcClient.Modules (programmatic or DI auto-attached).
  • Two-facade compositionAddCalloraVoip(sip => …).AddWebRtc(rtc => …).
  • SamplesWebRtcPeer, WebRtcRecording, WebRtcDependencyInjection, and a simplest-form
    browser video-call website (WebRtcVideoCall.Web).

💥 Breaking changes

The SIP-facade configuration types were renamed so each facade owns a facade-scoped name (parallel
to WebRtcConfiguration / WebRtcOptions / AddCalloraWebRtc), freeing the Callora* names for the
upcoming composition layer. There are no compatibility aliases.

Before After
SdkConfiguration VoipConfiguration
SdkOptions VoipOptions
AddCallora(...) AddCalloraVoip(...)

Migration — rename these three symbols at your call sites:

// before
services.AddCallora(o => { /* … */ });
var cfg = new SdkConfiguration { /* … */ };

// after
services.AddCalloraVoip(o => { /* … */ });
var cfg = new VoipConfiguration { /* … */ };

VoipClient and all other public types are unchanged; behaviour is identical.

⚠️ Preview limitations

- Not yet validated against real browsers (Chrome/Firefox).
- Both peers need a configured media port until early-bind / trickle ICE lands.
- No data channels (SCTP), TURN relay or simulcast yet.

📦 Targets

net8.0 · net9.0 · net10.0

Full changelog: CHANGELOG.md (https://github.com/BechsteinDigital/CalloraVoipSDK/blob/main/CHANGELOG.md)

v4.5.0 — Public video API (transport-only)

Choose a tag to compare

@BechsteinDigital BechsteinDigital released this 15 Jul 19:38

[4.5.0] - 2026-07-15

Added

  • Public video API (transport-only): send and receive encoded video frames over the public
    facade. client.Media.CreateVideoReceiver() exposes inbound frames via
    IVideoReceiver.FrameReceived (a VideoFrame: encoded payload, RTP payload type, 90 kHz
    timestamp, key-frame flag); client.Media.CreateVideoSender().SendAsync(VideoFrame) injects
    outbound encoded frames. The SDK negotiates the video m-line, packetizes/depacketizes RTP
    (VP8, H.264) and moves the bytes — it never encodes or decodes. Bring your own codec.
  • Recommended outbound video bitrate: IVideoSender.RecommendedBitrateBps and
    NetworkQuality (Good/Fair/Poor) are derived from transport-cc feedback, with a
    RecommendedBitrateChanged event so you can size your encoder to the network in one line
    (sender.RecommendedBitrateChanged += (_, e) => encoder.SetBitrate(e.RecommendedBitrateBps)).
  • Keyframe handling: inbound frames carry VideoFrame.IsKeyFrame (VP8 P-bit, H.264 IDR);
    IVideoSender.KeyFrameRequested fires when the peer requests a fresh reference frame (RTCP
    PLI/FIR) so you can force an intra frame. On inbound loss the SDK reports it to the peer
    (Generic NACK + throttled PLI, RFC 4585) gated on the peer's advertised feedback. FIR is
    honoured on receive but not generated.
  • Default-video convenience: client.AttachDefaultVideoAsync(call) /
    DetachDefaultVideoAsync(call) wire an application-supplied IVideoDevice (your codec
    package: capture + encode + decode + render) to the call, mirroring
    AttachDefaultAudioAsync. The device is resolved from dependency injection and receives the
    negotiated codec via VideoConnectionParameters; without a registered IVideoDevice the
    attach fails closed (the core ships no codec). Negotiated video parameters are readable on
    ICall.MediaParameters.Video (CallVideoParameters).
  • Example: examples/CalloraVoipSdk.Sample.VideoCalling wires a video call over the public
    API only, including the bitrate hook against a marked StubVideoEncoder placeholder.

v4.4.1

Choose a tag to compare

@BechsteinDigital BechsteinDigital released this 12 Jul 10:18

Full Changelog: v4.4.0...v4.4.1