Skip to content

feat(interceptor): add JitterBuffer receiver-side interceptor#84

Open
nightness wants to merge 1 commit intowebrtc-rs:masterfrom
Brainwires:feat/jitter-buffer
Open

feat(interceptor): add JitterBuffer receiver-side interceptor#84
nightness wants to merge 1 commit intowebrtc-rs:masterfrom
Brainwires:feat/jitter-buffer

Conversation

@nightness
Copy link
Copy Markdown

Summary

  • Add JitterBufferInterceptor — a receiver-side interceptor that buffers incoming RTP packets and releases them in sequence-number order after a playout delay
  • Implements adaptive delay using RFC 3550 §A.8 jitter formula (jitter += (d - jitter) / 16.0)
  • Handles u16 sequence number wraparound via wrapping_sub(seq) < 0x8000 comparisons
  • Force-releases packets held longer than max_delay to prevent starvation
  • RTCP packets pass through immediately (never buffered)
  • JitterBufferBuilder with configurable min_delay (20ms), initial_delay (50ms), max_delay (500ms)
  • 6 unit tests covering in-order release, reordering, force-release, jitter adaptation, RTCP passthrough, unbind

Design

JitterBuffer → NackGenerator → ReceiverReport → TwccReceiver → NoopInterceptor

In poll_read: calls stream.pop_ready(now) for all streams, injects ready packets via inner.handle_read(), then returns inner.poll_read(). This ensures all downstream interceptors see every packet.

Test plan

  • cargo test -p rtc-interceptor jitter_buffer
  • cargo test -p rtc-interceptor (all 130+ tests pass)

🤖 Generated with Claude Code

Adds a new `JitterBufferInterceptor` that buffers incoming RTP packets
per SSRC and releases them in sequence order after an adaptive playout
delay computed from the RFC 3550 §A.8 jitter formula.

- `JitterBufferStream` (stream.rs): per-SSRC packet buffer with adaptive
  target delay; force-release after max_delay to prevent starvation;
  playout-delay RTP extension (ietf WebRTC draft) for sender-side hints
- `JitterBufferInterceptor<P>` (mod.rs): wraps inner chain; buffers RTP
  for tracked SSRCs, passes RTCP and untracked-SSRC packets immediately;
  drains ready packets into inner chain in handle_timeout + poll_read
- `JitterBufferBuilder`: configurable min/max/initial delay with sensible
  defaults (20 ms / 500 ms / 50 ms)
- Jitter update skips out-of-order RTP timestamps to prevent spurious
  delay spikes from reordered packets
- 15 unit tests across stream.rs and mod.rs; all 129 interceptor tests pass

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant