| 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);
|
| }
|
| }
|
|
|
|
|