| Index: webrtc/video/video_send_stream.cc
|
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
|
| index 08210598015de94df65047d9e1d9eda73b6dcd40..04748f8d3f81c4e200911623f7bf547367d2945a 100644
|
| --- a/webrtc/video/video_send_stream.cc
|
| +++ b/webrtc/video/video_send_stream.cc
|
| @@ -10,6 +10,7 @@
|
| #include "webrtc/video/video_send_stream.h"
|
|
|
| #include <algorithm>
|
| +#include <cmath>
|
| #include <sstream>
|
| #include <string>
|
| #include <utility>
|
| @@ -27,6 +28,7 @@
|
| #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
|
| #include "webrtc/modules/utility/include/process_thread.h"
|
| #include "webrtc/modules/video_coding/utility/ivf_file_writer.h"
|
| +#include "webrtc/system_wrappers/include/field_trial.h"
|
| #include "webrtc/video/call_stats.h"
|
| #include "webrtc/video/vie_remb.h"
|
| #include "webrtc/video_send_stream.h"
|
| @@ -49,6 +51,7 @@ std::vector<RtpRtcp*> CreateRtpRtcpModules(
|
| SendDelayStats* send_delay_stats,
|
| RtcEventLog* event_log,
|
| RateLimiter* retransmission_rate_limiter,
|
| + OverheadObserver* overhead_observer,
|
| size_t num_modules) {
|
| RTC_DCHECK_GT(num_modules, 0);
|
| RtpRtcp::Configuration configuration;
|
| @@ -72,7 +75,7 @@ std::vector<RtpRtcp*> CreateRtpRtcpModules(
|
| configuration.send_packet_observer = send_delay_stats;
|
| configuration.event_log = event_log;
|
| configuration.retransmission_rate_limiter = retransmission_rate_limiter;
|
| -
|
| + configuration.overhead_observer = overhead_observer;
|
| std::vector<RtpRtcp*> modules;
|
| for (size_t i = 0; i < num_modules; ++i) {
|
| RtpRtcp* rtp_rtcp = RtpRtcp::CreateRtpRtcp(configuration);
|
| @@ -284,6 +287,7 @@ namespace internal {
|
| // An encoder may deliver frames through the EncodedImageCallback on an
|
| // arbitrary thread.
|
| class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver,
|
| + public webrtc::OverheadObserver,
|
| public webrtc::VCMProtectionCallback,
|
| public ViEEncoder::EncoderSink {
|
| public:
|
| @@ -337,6 +341,9 @@ class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver,
|
| uint32_t* sent_nack_rate_bps,
|
| uint32_t* sent_fec_rate_bps) override;
|
|
|
| + // Implements OverheadObserver.
|
| + void OnOverheadChanged(size_t overhead_bytes_per_packet) override;
|
| +
|
| void OnEncoderConfigurationChanged(std::vector<VideoStream> streams,
|
| int min_transmit_bitrate_bps) override;
|
|
|
| @@ -398,6 +405,10 @@ class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver,
|
| // |weak_ptr_factory_| must be declared last to make sure all WeakPtr's are
|
| // invalidated before any other members are destroyed.
|
| rtc::WeakPtrFactory<VideoSendStreamImpl> weak_ptr_factory_;
|
| +
|
| + rtc::CriticalSection overhead_bytes_per_packet_crit_;
|
| + size_t overhead_bytes_per_packet_ GUARDED_BY(overhead_bytes_per_packet_crit_);
|
| + size_t transport_overhead_bytes_per_packet_;
|
| };
|
|
|
| // TODO(tommi): See if there's a more elegant way to create a task that creates
|
| @@ -734,10 +745,13 @@ VideoSendStreamImpl::VideoSendStreamImpl(
|
| send_delay_stats,
|
| event_log,
|
| congestion_controller_->GetRetransmissionRateLimiter(),
|
| + this,
|
| config_->rtp.ssrcs.size())),
|
| payload_router_(rtp_rtcp_modules_,
|
| config_->encoder_settings.payload_type),
|
| - weak_ptr_factory_(this) {
|
| + weak_ptr_factory_(this),
|
| + overhead_bytes_per_packet_(0),
|
| + transport_overhead_bytes_per_packet_(0) {
|
| RTC_DCHECK_RUN_ON(worker_queue_);
|
| LOG(LS_INFO) << "VideoSendStreamInternal: " << config_->ToString();
|
| weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
|
| @@ -777,15 +791,12 @@ VideoSendStreamImpl::VideoSendStreamImpl(
|
|
|
| // TODO(pbos): Should we set CNAME on all RTP modules?
|
| rtp_rtcp_modules_.front()->SetCNAME(config_->rtp.c_name.c_str());
|
| - // 28 to match packet overhead in ModuleRtpRtcpImpl.
|
| - static const size_t kRtpPacketSizeOverhead = 28;
|
| - RTC_DCHECK_LE(config_->rtp.max_packet_size, 0xFFFFu + kRtpPacketSizeOverhead);
|
| - const uint16_t mtu = static_cast<uint16_t>(config_->rtp.max_packet_size +
|
| - kRtpPacketSizeOverhead);
|
| +
|
| for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
|
| rtp_rtcp->RegisterRtcpStatisticsCallback(stats_proxy_);
|
| rtp_rtcp->RegisterSendChannelRtpStatisticsCallback(stats_proxy_);
|
| - rtp_rtcp->SetMaxTransferUnit(mtu);
|
| + rtp_rtcp->SetMaxTransferUnit(
|
| + static_cast<uint16_t>(config_->rtp.max_packet_size));
|
| rtp_rtcp->RegisterVideoSendPayload(
|
| config_->encoder_settings.payload_type,
|
| config_->encoder_settings.payload_name.c_str());
|
| @@ -1155,6 +1166,19 @@ uint32_t VideoSendStreamImpl::OnBitrateUpdated(uint32_t bitrate_bps,
|
| RTC_DCHECK_RUN_ON(worker_queue_);
|
| RTC_DCHECK(payload_router_.active())
|
| << "VideoSendStream::Start has not been called.";
|
| +
|
| + 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;
|
| + }
|
| +
|
| // Get the encoder target rate. It is the estimated network rate -
|
| // protection overhead.
|
| encoder_target_rate_bps_ = protection_bitrate_calculator_.SetTargetRates(
|
| @@ -1214,10 +1238,22 @@ int VideoSendStreamImpl::ProtectionRequest(
|
| return 0;
|
| }
|
|
|
| +void VideoSendStreamImpl::OnOverheadChanged(size_t overhead_bytes_per_packet) {
|
| + rtc::CritScope lock(&overhead_bytes_per_packet_crit_);
|
| + overhead_bytes_per_packet_ = overhead_bytes_per_packet;
|
| +}
|
| +
|
| void VideoSendStreamImpl::SetTransportOverhead(
|
| - int transport_overhead_per_packet) {
|
| - for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
|
| - rtp_rtcp->SetTransportOverhead(transport_overhead_per_packet);
|
| + int transport_overhead_bytes_per_packet) {
|
| + 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);
|
| + for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
|
| + rtp_rtcp->SetTransportOverhead(transport_overhead_bytes_per_packet);
|
| + rtp_rtcp->SetMaxTransferUnit(mtu);
|
| + }
|
| }
|
|
|
| } // namespace internal
|
|
|