Releases: BechsteinDigital/callora-voip-sdk
Release list
v4.6.0-preview.2 — STUN/TURN server, WebRTC RTCP quality & SIP compliance
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 server —
AddCalloraStunServer(...)/AddCalloraTurnServer(...)
with TURN control over UDP/TCP/TLS (end-to-end covered), inbound FINGERPRINT validation on both
servers,DONT-FRAGMENTon 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 onWebRtcStats(JitterMset 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;obcontact parameter (CF-067b). THIRD-PARTY-NOTICES.md— license attribution for all runtime dependencies.
v4.6.0-preview.1 — WebRTC facade (preview) & Voip* config rename
⚠️ 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/IWebRtcClient—new WebRtcClient()or DI viaAddCalloraWebRtc(...);
CreatePeer()returns anIPeerConnection.- Signalling happy path —
peer.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 model —
TrackReceived→RemoteTrack(Kind,StreamId= remotea=msid,
TrackId) withEncodedFrame(payload, RTP timestamp, key-frame flag). - Multi-peer manager —
IWebRtcClient.Peers. - L3 extension seams —
IMediaTap+AttachMediaTap(in/out media for recording/analytics/AI);
IWebRtcClientModule+IWebRtcClient.Modules(programmatic or DI auto-attached). - Two-facade composition —
AddCalloraVoip(sip => …).AddWebRtc(rtc => …). - Samples —
WebRtcPeer,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)
[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(aVideoFrame: 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.RecommendedBitrateBpsand
NetworkQuality(Good/Fair/Poor) are derived from transport-cc feedback, with a
RecommendedBitrateChangedevent 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.KeyFrameRequestedfires 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-suppliedIVideoDevice(your codec
package: capture + encode + decode + render) to the call, mirroring
AttachDefaultAudioAsync. The device is resolved from dependency injection and receives the
negotiated codec viaVideoConnectionParameters; without a registeredIVideoDevicethe
attach fails closed (the core ships no codec). Negotiated video parameters are readable on
ICall.MediaParameters.Video(CallVideoParameters). - Example:
examples/CalloraVoipSdk.Sample.VideoCallingwires a video call over the public
API only, including the bitrate hook against a markedStubVideoEncoderplaceholder.