| Index: webrtc/video/video_send_stream.cc
|
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
|
| index 3b4238c47da00fe4c07a3654d2ecdf1a7bedd303..aa675320465dc59f87b9bab2ae3245ec71b0393f 100644
|
| --- a/webrtc/video/video_send_stream.cc
|
| +++ b/webrtc/video/video_send_stream.cc
|
| @@ -289,6 +289,24 @@ int CalculateMaxPadBitrateBps(std::vector<VideoStream> streams,
|
| return pad_up_to_bitrate_bps;
|
| }
|
|
|
| +uint32_t CalculateOverheadRateBps(int packets_per_second,
|
| + size_t overhead_bytes_per_packet,
|
| + uint32_t max_overhead_bps) {
|
| + if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") !=
|
| + "Enabled")
|
| + return 0;
|
| + uint32_t overhead_bps =
|
| + static_cast<uint32_t>(8 * overhead_bytes_per_packet * packets_per_second);
|
| + return std::min(overhead_bps, max_overhead_bps);
|
| +}
|
| +
|
| +int CalculatePacketRate(uint32_t bitrate_bps, size_t packet_size_bytes) {
|
| + size_t packet_size_bits = 8 * packet_size_bytes;
|
| + // Ceil for int value of bitrate_bps / packet_size_bits.
|
| + return static_cast<int>((bitrate_bps + packet_size_bits - 1) /
|
| + packet_size_bits);
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace internal {
|
| @@ -1203,36 +1221,35 @@ uint32_t VideoSendStreamImpl::OnBitrateUpdated(uint32_t bitrate_bps,
|
| RTC_DCHECK(payload_router_.IsActive())
|
| << "VideoSendStream::Start has not been called.";
|
|
|
| - if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") ==
|
| - "Enabled") {
|
| - // Subtract total overhead (transport + rtp) from bitrate.
|
| - size_t rtp_overhead;
|
| - {
|
| - rtc::CritScope lock(&overhead_bytes_per_packet_crit_);
|
| - rtp_overhead = overhead_bytes_per_packet_;
|
| - }
|
| - RTC_CHECK_GE(rtp_overhead, 0);
|
| - RTC_DCHECK_LT(rtp_overhead, config_->rtp.max_packet_size);
|
| - if (rtp_overhead >= config_->rtp.max_packet_size) {
|
| - LOG(LS_WARNING) << "RTP overhead (" << rtp_overhead << " bytes)"
|
| - << "exceeds maximum packet size ("
|
| - << config_->rtp.max_packet_size << " bytes)";
|
| -
|
| - bitrate_bps = 0;
|
| - } else {
|
| - bitrate_bps =
|
| - static_cast<uint32_t>(static_cast<uint64_t>(bitrate_bps) *
|
| - (config_->rtp.max_packet_size - rtp_overhead) /
|
| - (config_->rtp.max_packet_size +
|
| - transport_overhead_bytes_per_packet_));
|
| - }
|
| - }
|
| + // Substract overhead from bitrate.
|
| + rtc::CritScope lock(&overhead_bytes_per_packet_crit_);
|
| + uint32_t payload_bitrate_bps =
|
| + bitrate_bps -
|
| + CalculateOverheadRateBps(
|
| + CalculatePacketRate(bitrate_bps,
|
| + config_->rtp.max_packet_size +
|
| + transport_overhead_bytes_per_packet_),
|
| + overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_,
|
| + bitrate_bps);
|
|
|
| // Get the encoder target rate. It is the estimated network rate -
|
| // protection overhead.
|
| encoder_target_rate_bps_ = protection_bitrate_calculator_.SetTargetRates(
|
| - bitrate_bps, stats_proxy_->GetSendFrameRate(), fraction_loss, rtt);
|
| - uint32_t protection_bitrate = bitrate_bps - encoder_target_rate_bps_;
|
| + payload_bitrate_bps, stats_proxy_->GetSendFrameRate(), fraction_loss,
|
| + rtt);
|
| +
|
| + uint32_t encoder_overhead_rate_bps = CalculateOverheadRateBps(
|
| + CalculatePacketRate(encoder_target_rate_bps_,
|
| + config_->rtp.max_packet_size +
|
| + transport_overhead_bytes_per_packet_ -
|
| + overhead_bytes_per_packet_),
|
| + overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_,
|
| + bitrate_bps - encoder_target_rate_bps_);
|
| +
|
| + // When the field trial "WebRTC-SendSideBwe-WithOverhead" is enabled
|
| + // protection_bitrate includes overhead.
|
| + uint32_t protection_bitrate =
|
| + bitrate_bps - (encoder_target_rate_bps_ + encoder_overhead_rate_bps);
|
|
|
| encoder_target_rate_bps_ =
|
| std::min(encoder_max_bitrate_bps_, encoder_target_rate_bps_);
|
|
|