Google Congestion Control 实现分析之二
Table of Contents
总体流程
当收到 Transport Wide CC RTCP report 时候 ,会回调 OnTransportPacketsFeedback 方法
s=>start
e=>end
s1=>operation: send rtp with TWCC header
s2=>operation: receive rtp packet
s3=>operation: compose TWCC feedback
s4=>operation: send rtcp packet
s5=>operation: receive rtcp packet
s6=>operation: parse rtcp packet
s7=>operation: bandwidth estimate
s8=>operation: adjust send bitrate
s->s1->s2->s3->s4->s5->s6->s7->s8->e
主要的逻辑在发送方
title WebRTC congestion control v1
participant RtpSender as sender
participant CongestionController as controller
participant TransportFeedbackAdpater as adapter
participant AcknowledgedBitrateEstimator as ack_estimator
participant ProbeController as probe_controller
participant DelayBasedBwe as delay_based_bwe
participant BitrateController as bitrate_controller
autonumber
->sender: ReceiveRtcp
alt RTCP of transport feedback
sender->controller: OnTransportFeedback(feedback)
controller->adapter: onTransportFeedback(feedback)
end
alt currently_in_alr
controller->ack_estimator: SetAlrEndedTimeMs(now_ms)
controller->probe_controller: SetAlrEndedTimeMs(now_ms)
end
controller->ack_estimator: IncomingPacketFeedbackVector(feedback_vector)
controller->ack_estimator: bitrate_bps()
controller->delay_based_bwe:IncomingPacketFeedbackVector(...)
delay_based_bwe-->controller: result
alt result.updated
controller->bitrate_controller: OnDelayBasedBweResult(result)
controller->controller: MaybeTriggerOnNetworkChanged()
end
alt result.recovered_from_overuse
controller->probe_controller: RequestProbe()
end
alt in_cwnd_experiment
controller->controller: LimitOutstandingBytes(adapter.GetOutstandingBytes())
end
1) 先算反馈确认的带宽 ack_bitrate
acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(packets);
2) 再算探测的带宽 probe_bitrate
probe_bitrate_estimator_->HandleProbeAndEstimateBitrate(packet);
3) 再算基于延迟的带宽 delay_based target_bitrate
NetworkControlUpdate GoogCcNetworkController::OnTransportPacketsFeedback(
//...
result = delay_based_bwe_->IncomingPacketFeedbackVector(
report, acknowledged_bitrate, probe_bitrate, estimate_,
alr_start_time.has_value());
}
4) 再计算基于丢包的带宽 loss_based target_bitrate
if (result.updated) {
if (result.probe) {
bandwidth_estimation_->SetSendBitrate(result.target_bitrate,
report.feedback_time);
}
// Since SetSendBitrate now resets the delay-based estimate, we have to
// call UpdateDelayBasedEstimate after SetSendBitrate.
bandwidth_estimation_->UpdateDelayBasedEstimate(report.feedback_time,
result.target_bitrate);
// Update the estimate in the ProbeController, in case we want to probe.
MaybeTriggerOnNetworkChanged(&update, report.feedback_time);
}
注:
std::unique_ptr<SendSideBandwidthEstimation> bandwidth_estimation_;
1), 2) 主要是通过实际发送和接收的字节来计算流量,估算带宽
3) 通过看单向延迟梯度的变化来估算带宽, 综合考虑 1) 和 2)
4) 通过看丢包率来估算带宽, 也要综合考虑 3)
Delay
Comments |0|
Category: WebRTC