CongestionController
网络拥塞控制主模块,综合了基于丢包估算和基于网络延迟估算方式进行的
-
内部成员实例
// rtprtcp模块包装,适配到节拍器中 PacketRouter* const packet_router_; //发送节拍器 const std::unique_ptr<PacedSender> pacer_; //控制估算码率,可以基于丢包进行码率调整 const std::unique_ptr<BitrateController> bitrate_controller_; //用于探测发送码率控制的 const std::unique_ptr<ProbeController> probe_controller_; //测试数据是否在设置的最大码率里面 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_; //接收端,估算出码率反馈给发送端, 回调 OnReceiveBitrateChanged WrappingBitrateEstimator remote_bitrate_estimator_; //接收端使用这个对象,发送反馈包的 RemoteEstimatorProxy remote_estimator_proxy_; //基于延迟计算码率 bitrate_controller_作为参数设置到此对象中 // 处理RemoteEstimatorProxy发送过来的反馈包 TransportFeedbackAdapter transport_feedback_adapter_;
-
接收端数据收集
void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, size_t payload_size, const RTPHeader& header) { // Send-side BWE. if (header.extension.hasTransportSequenceNumber) { //接收端使用这个,把接收信息反馈给发送端,由发送端进行估算 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, header); } else { // Receive-side BWE. //接收端使用这个,计算出码率,通过remb反馈给发送端 remote_bitrate_estimator_.IncomingPacket(arrival_time_ms, payload_size, header); } }
-
发送端使用处理逻辑
void CongestionController::Process() { //发送端控制码率估算, bitrate_controller_->Process(); //老的码率估算方式gcc方式,接收端进行码率估算,为REMB提供数据 remote_bitrate_estimator_.Process(); //发送端控制是否进行码率探测 probe_controller_->Process(); //如果估算了新的码率,更新到发送节拍器中 MaybeTriggerOnNetworkChanged(); }
4.网络状态改变的时候,触发探测码率
void CongestionController::SignalNetworkState(NetworkState state) {
if (state == kNetworkUp) {
pacer_->Resume();
} else {
pacer_->Pause();
}
{
rtc::CritScope cs(&critsect_);
network_state_ = state;
}
//触发码率探测控制,主要网络up后,进行大码率测试
probe_controller_->OnNetworkStateChanged(state);
MaybeTriggerOnNetworkChanged();
}
-
对外的主要接口(成员变量注释)
virtual BitrateController* GetBitrateController() const; virtual RemoteBitrateEstimator* GetRemoteBitrateEstimator( bool send_side_bwe); virtual int64_t GetPacerQueuingDelayMs() const; virtual PacedSender* pacer() { return pacer_.get(); } virtual TransportFeedbackObserver* GetTransportFeedbackObserver();