webrtc-SendSideBandwidthEstimation

SendSideBandwidthEstimation

  1. 基于RTCP-RR包的,丢包进行码率估算
  2. 综合基于延迟的码率,估算出目标码率
    这个是估算码率的最终输出类

一. 基于延迟模块估算码率后调用此函数 ,用于(四.)的计算

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;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值