feat: P3-T3 bandwidth estimation — GCC-style congestion control
BandwidthEstimator tracks available bandwidth using dual signals: Delay-based: EMA of RTT vs baseline minimum. If RTT > 1.5x baseline → Overuse (congestion). If RTT < 1.1x baseline → Underuse (headroom). Baseline slowly drifts up to handle route changes. Loss-based: sliding window of 10 loss samples. Average > 5% → congested. Rate adaptation (AIMD): - Overuse OR loss congested: decrease 15% (multiplicative) - Underuse AND no loss: increase 5% (additive) - Normal: hold steady - Clamped to [min_bw, max_bw] recommended_profile() maps bandwidth to quality tier: - >= 25 kbps → GOOD (Opus 24k + 20% FEC) - >= 8 kbps → DEGRADED (Opus 6k + 50% FEC) - < 8 kbps → CATASTROPHIC (Codec2 1200 + 100% FEC) from_quality_report() integrates with existing QualityReport packets. 54 proto tests passing (12 new bandwidth tests). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
//! - Identity = 32-byte seed → HKDF → Ed25519 (signing) + X25519 (encryption)
|
||||
//! - Fingerprint = SHA-256(Ed25519 pub)[:16]
|
||||
|
||||
pub mod bandwidth;
|
||||
pub mod codec_id;
|
||||
pub mod error;
|
||||
pub mod jitter;
|
||||
@@ -27,6 +28,7 @@ pub use packet::{
|
||||
HangupReason, MediaHeader, MediaPacket, MiniFrameContext, MiniHeader, QualityReport,
|
||||
SignalMessage, TrunkEntry, TrunkFrame, FRAME_TYPE_FULL, FRAME_TYPE_MINI,
|
||||
};
|
||||
pub use bandwidth::{BandwidthEstimator, CongestionState};
|
||||
pub use quality::{AdaptiveQualityController, Tier};
|
||||
pub use session::{Session, SessionEvent, SessionState};
|
||||
pub use traits::*;
|
||||
|
||||
Reference in New Issue
Block a user