SendSideBandwidthEstimation
- 基于RTCP-RR包的,丢包进行码率估算
- 综合基于延迟的码率,估算出目标码率
这个是估算码率的最终输出类
一. 基于延迟模块估算码率后调用此函数 ,用于(四.)的计算
void UpdateDelayBasedEstimate(int64_t now_ms, uint32_t bitrate_bps);
二. 接收端通过 rtcp .remb返回的建议码率,
这个好像是老版本的gcc估算方式
新版本的bwe,接收端的码率估算也放到了发送端进行的,就是上面一。部分
// Call when we receive a RTCP message with TMMBR or REMB.
void UpdateReceiverEstimate(int64_t now_ms, uint32_t bandwidth);
三. 接收到rtcp rr包,会调用此函数,用于计算基于丢包算法,码率
void UpdateReceiverBlock(uint8_t fraction_loss,
int64_t rtt,
int number_of_packets,
int64_t now_ms){
....
if (number_of_packets > 0) {
const int num_lost_packets_Q8 = fraction_loss * number_of_packets;
lost_packets_since_last_loss_update_Q8_ += num_lost_packets_Q8;
expected_packets_since_last_loss_update_ += number_of_packets;
// 丢包数太小了,不关心了
if (expected_packets_since_last_loss_update_ < kLimitNumPackets)
return;
has_decreased_since_last_fraction_loss_ = false;
// 累积多次的数据计算一个丢包率
last_fraction_loss_ = lost_packets_since_last_loss_update_Q8_ /
expected_packets_since_last_loss_update_;
lost_packets_since_last_loss_update_Q8_ = 0;
expected_packets_since_last_loss_update_ = 0;
last_packet_report_ms_ = now_ms;
//基于last_fraction_loss_丢包率,计算一个建议码
UpdateEstimate(now_ms);
}
}
//仅仅分析基于丢包部分
void UpdateEstimate(int64_t now_ms) {
...
UpdateMinHistory(now_ms);
int64_t time_since_packet_report_ms = now_ms - last_packet_report_ms_;
int64_t time_since_feedback_ms = now_ms - last_feedback_ms_;
//
// 分析时间窗口有阈值限制,
if (time_since_packet_report_ms < 1.2 * kFeedbackIntervalMs) {
if (last_fraction_loss_ <= 5) {
// 丢包率比较小的时候 <%2 (5/256),提高码率 his * 1.08
bitrate_ = static_cast<uint32_t>(min_bitrate_history_.front().second * 1.08 + 0.5);
bitrate_ += 1000;
} else if (last_fraction_loss_ <= 26) {
// 丢包率可接收范围2% - 10%,不进行改变
}else {
// 丢包率较高 >10%- 降低码率
if (!has_decreased_since_last_fraction_loss_ &&
(now_ms - time_last_decrease_ms_) >=
(kBweDecreaseIntervalMs + last_round_trip_time_ms_)) {
// 如果最近time_last_decrease_ms_降低过码率了,则不进行改变
time_last_decrease_ms_ = now_ms;
// newRate = rate * (1 - 0.5*lossRate);
// 1 - 0.5*lossRate ===> (512 - last_fraction_loss_)/512
bitrate_ = static_cast<uint32_t>((bitrate_ * static_cast<double>(512 - last_fraction_loss_)) /
512.0);
has_decreased_since_last_fraction_loss_ = true;
}
}
}
...
//更新一下码率
uint32_t capped_bitrate = CapBitrateToThresholds(now_ms, bitrate_);
bitrate_ = capped_bitrate;
}
四. 基于设置的n个的码率,生成一个有效的码率(最小,最大之间的)
uint32_t CapBitrateToThresholds(
int64_t now_ms, uint32_t bitrate) {
if (bwe_incoming_ > 0 && bitrate > bwe_incoming_) {
//
// 接收的带宽比较
bitrate = bwe_incoming_;
}
if (delay_based_bitrate_bps_ > 0 && bitrate > delay_based_bitrate_bps_) {
//
// 接收端基于网络延迟估算的带宽
bitrate = delay_based_bitrate_bps_;
}
if (bitrate > max_bitrate_configured_) {
//
// 外部限制的最大带宽
bitrate = max_bitrate_configured_;
}
if (bitrate < min_bitrate_configured_) {
//
// 外部限制的最小带宽
if (last_low_bitrate_log_ms_ == -1 ||
now_ms - last_low_bitrate_log_ms_ > kLowBitrateLogPeriodMs) {
LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate / 1000
<< " kbps is below configured min bitrate "
<< min_bitrate_configured_ / 1000 << " kbps.";
last_low_bitrate_log_ms_ = now_ms;
}
bitrate = min_bitrate_configured_;
}
return bitrate;
}
五,返回综合估算出的码率
// 获取这个模块计算出来的码率,丢包,rtt
void CurrentEstimate(int* bitrate, uint8_t* loss, int64_t* rtt) const;