| Index: webrtc/video/video_send_stream.cc | 
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc | 
| index 9a3b51e278a0c4f69608e9ea5966f9b82e7f76d2..6dc68484d118da216a0d24116c5f99ff0ce0bab5 100644 | 
| --- a/webrtc/video/video_send_stream.cc | 
| +++ b/webrtc/video/video_send_stream.cc | 
| @@ -39,6 +39,9 @@ namespace webrtc { | 
| static const int kMinSendSidePacketHistorySize = 600; | 
| namespace { | 
|  | 
| +// We don't do MTU discovery, so assume that we have the standard ethernet MTU. | 
| +const size_t kPathMTU = 1500; | 
| + | 
| std::vector<RtpRtcp*> CreateRtpRtcpModules( | 
| Transport* outgoing_transport, | 
| RtcpIntraFrameObserver* intra_frame_callback, | 
| @@ -326,7 +329,7 @@ class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver, | 
| void EnableEncodedFrameRecording(const std::vector<rtc::PlatformFile>& files, | 
| size_t byte_limit); | 
|  | 
| -  void SetTransportOverhead(int transport_overhead_per_packet); | 
| +  void SetTransportOverhead(size_t transport_overhead_per_packet); | 
|  | 
| private: | 
| class CheckEncoderActivityTask; | 
| @@ -689,7 +692,8 @@ VideoSendStream::RtpStateMap VideoSendStream::StopPermanentlyAndGetRtpStates() { | 
| return state_map; | 
| } | 
|  | 
| -void VideoSendStream::SetTransportOverhead(int transport_overhead_per_packet) { | 
| +void VideoSendStream::SetTransportOverhead( | 
| +    size_t transport_overhead_per_packet) { | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| VideoSendStreamImpl* send_stream = send_stream_.get(); | 
| worker_queue_->PostTask([send_stream, transport_overhead_per_packet] { | 
| @@ -808,8 +812,7 @@ VideoSendStreamImpl::VideoSendStreamImpl( | 
| for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 
| rtp_rtcp->RegisterRtcpStatisticsCallback(stats_proxy_); | 
| rtp_rtcp->RegisterSendChannelRtpStatisticsCallback(stats_proxy_); | 
| -    rtp_rtcp->SetMaxTransferUnit( | 
| -        static_cast<uint16_t>(config_->rtp.max_packet_size)); | 
| +    rtp_rtcp->SetMaxRtpPacketSize(config_->rtp.max_packet_size); | 
| rtp_rtcp->RegisterVideoSendPayload( | 
| config_->encoder_settings.payload_type, | 
| config_->encoder_settings.payload_name.c_str()); | 
| @@ -1188,14 +1191,27 @@ uint32_t VideoSendStreamImpl::OnBitrateUpdated(uint32_t bitrate_bps, | 
|  | 
| if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") == | 
| "Enabled") { | 
| -    // Substract overhead from bitrate. | 
| -    rtc::CritScope lock(&overhead_bytes_per_packet_crit_); | 
| -    int packets_per_second = | 
| -        std::ceil(bitrate_bps / (8 * (config_->rtp.max_packet_size + | 
| -                                      transport_overhead_bytes_per_packet_))); | 
| -    uint32_t overhead_bps = static_cast<uint32_t>( | 
| -        8 * overhead_bytes_per_packet_ * packets_per_second); | 
| -    bitrate_bps = overhead_bps > bitrate_bps ? 0u : bitrate_bps - overhead_bps; | 
| +    // 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_)); | 
| +    } | 
| } | 
|  | 
| // Get the encoder target rate. It is the estimated network rate - | 
| @@ -1263,15 +1279,23 @@ void VideoSendStreamImpl::OnOverheadChanged(size_t overhead_bytes_per_packet) { | 
| } | 
|  | 
| void VideoSendStreamImpl::SetTransportOverhead( | 
| -    int transport_overhead_bytes_per_packet) { | 
| +    size_t transport_overhead_bytes_per_packet) { | 
| +  if (transport_overhead_bytes_per_packet >= static_cast<int>(kPathMTU)) { | 
| +    LOG(LS_ERROR) << "Transport overhead exceeds size of ethernet frame"; | 
| +    return; | 
| +  } | 
| + | 
| transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; | 
| -  RTC_DCHECK_LE(config_->rtp.max_packet_size, | 
| -                0xFFFFu + transport_overhead_bytes_per_packet); | 
| -  const uint16_t mtu = static_cast<uint16_t>( | 
| -      config_->rtp.max_packet_size + transport_overhead_bytes_per_packet); | 
| + | 
| +  congestion_controller_->SetTransportOverhead( | 
| +      transport_overhead_bytes_per_packet_); | 
| + | 
| +  size_t rtp_packet_size = | 
| +      std::min(config_->rtp.max_packet_size, | 
| +               kPathMTU - transport_overhead_bytes_per_packet_); | 
| + | 
| for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 
| -    rtp_rtcp->SetTransportOverhead(transport_overhead_bytes_per_packet); | 
| -    rtp_rtcp->SetMaxTransferUnit(mtu); | 
| +    rtp_rtcp->SetMaxRtpPacketSize(rtp_packet_size); | 
| } | 
| } | 
|  | 
|  |