Architecture
- 媒体数据经过编码后送到RTP queue
- 更新 RTP queue的size
- Media Rate Control模块负责计算媒体编码器的目标码率
- 从RTP queue中选择合适的RTP包送到send queue
- Send Transmission Control模块负责计算实际发送速率(pacing)
- RTCP反馈:用于计算ack和qdelay的相关信息
- Network Congestion Contral模块负责计算congestion window和send window
Algorithm Details
1. Network congestion control
职责:计算congestion window 和 send window
- qdelay
反馈信息中包含最大seq_no的received time,用于估算qdelay - qdelay_tread的估算
qdelay fraction每50ms更新一次,保存20个历史值
- Congestion window的更新
考虑丢包,ecn,qdelay等不同因素的影响
在fast increase 状态时,主要考虑增加newly acknowledged bytes
在非fast increase 状态时,则考虑了qdelay and qdelay_target
- Send Window 更新
当qdelay很小时,用于补偿congestion window,增大发送速率
- Pacing
- Resuming fast increase
当qdelay_trend 小于QDELAY_TREND_LO 一段时间 - Competing flows compensation
当与多个流竞争时,为了提高有效性(带宽占用率),动态调整qdelay_target来实现。但实际使用时建议关掉~
2. Media rate control
- rate_transmit: 实际发送的码率
- rate_ack: 实际被ack的码率
均200ms更新一次 - 特殊情况处理
- 一般情况
fast_increase = true,主要考虑了ramp-up speed
fast_increase = false,则综合考虑RTP queue 和 qdelay trend
- 边界限制
rate_media_limit_t = max(current_rate_t, max(rate_media,rtp_rate_median))
rate_media_limit_t *= (2.0-qdelay_trend_mem)
target_bitrate = min(target_bitrate, rate_media_limit_t)
target_bitrate = min(TARGET_BITRATE_MAX,
3. Receiver
- received RTP packets的list,即ack
- 最大序号的rtp包的timestamp,用于计算qdelay
- 反馈速率(packets/s)
rate_fb = min(50,max(2.5,rate_media/10000))