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))