Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Unified Diff: webrtc/pc/channel.cc

Issue 2437503004: Set actual transport overhead in rtp_rtcp (Closed)
Patch Set: Rename SignalTransportOverheadChanged to UpdateTransportOverhead. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/pc/channel.cc
diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc
index d9eb9b6facc7e5d3bedef03b9cbafc892b2c4512..7b483292fc76098200bac033f9a8fc1348b90f7c 100644
--- a/webrtc/pc/channel.cc
+++ b/webrtc/pc/channel.cc
@@ -172,7 +172,8 @@ BaseChannel::BaseChannel(rtc::Thread* worker_thread,
transport_controller_(transport_controller),
rtcp_enabled_(rtcp),
- media_channel_(media_channel) {
+ media_channel_(media_channel),
+ selected_candidate_pair_(nullptr) {
RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
if (transport_controller) {
RTC_DCHECK_EQ(network_thread, transport_controller->network_thread());
@@ -388,6 +389,7 @@ void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) {
void BaseChannel::DisconnectFromTransportChannel(TransportChannel* tc) {
RTC_DCHECK(network_thread_->IsCurrent());
+ OnSelectedCandidatePairChanged(tc, nullptr, -1, false);
tc->SignalWritableState.disconnect(this);
tc->SignalReadPacket.disconnect(this);
@@ -581,6 +583,7 @@ void BaseChannel::OnSelectedCandidatePairChanged(
RTC_DCHECK(channel == transport_channel_ ||
channel == rtcp_transport_channel_);
RTC_DCHECK(network_thread_->IsCurrent());
+ selected_candidate_pair_ = selected_candidate_pair;
std::string transport_name = channel->transport_name();
rtc::NetworkRoute network_route;
if (selected_candidate_pair) {
@@ -588,6 +591,8 @@ void BaseChannel::OnSelectedCandidatePairChanged(
ready_to_send, selected_candidate_pair->local_candidate().network_id(),
selected_candidate_pair->remote_candidate().network_id(),
last_sent_packet_id);
+
+ UpdateTransportOverhead();
}
invoker_.AsyncInvoke<void>(
RTC_FROM_HERE, worker_thread_,
@@ -905,16 +910,12 @@ void BaseChannel::ChannelWritable_n() {
LOG(LS_INFO) << "Channel writable (" << content_name_ << ")"
<< (was_ever_writable_ ? "" : " for the first time");
- std::vector<ConnectionInfo> infos;
- transport_channel_->GetStats(&infos);
- for (std::vector<ConnectionInfo>::const_iterator it = infos.begin();
- it != infos.end(); ++it) {
- if (it->best_connection) {
- LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString()
- << "->" << it->remote_candidate.ToSensitiveString();
- break;
- }
- }
+ if (selected_candidate_pair_)
+ LOG(LS_INFO)
+ << "Using "
+ << selected_candidate_pair_->local_candidate().ToSensitiveString()
+ << "->"
+ << selected_candidate_pair_->remote_candidate().ToSensitiveString();
was_ever_writable_ = true;
MaybeSetupDtlsSrtp_n();
@@ -1033,11 +1034,12 @@ bool BaseChannel::SetupDtlsSrtp_n(bool rtcp_channel) {
static_cast<int>(recv_key->size()));
}
- if (!ret)
+ if (!ret) {
LOG(LS_WARNING) << "DTLS-SRTP key installation failed";
- else
+ } else {
dtls_keyed_ = true;
-
+ UpdateTransportOverhead();
+ }
return ret;
}
@@ -1665,6 +1667,47 @@ void BaseChannel::UpdateMediaSendRecvState() {
Bind(&BaseChannel::UpdateMediaSendRecvState_w, this));
}
+int BaseChannel::GetTransportOverheadPerPacket() const {
+ RTC_DCHECK(network_thread_->IsCurrent());
+
+ if (!selected_candidate_pair_)
+ return 0;
+
+ int transport_overhead_per_packet = 0;
+
+ constexpr int kIpv4Overhaed = 20;
+ constexpr int kIpv6Overhaed = 40;
+ transport_overhead_per_packet +=
+ selected_candidate_pair_->local_candidate().address().family() == AF_INET
+ ? kIpv4Overhaed
+ : kIpv6Overhaed;
+
+ constexpr int kUdpOverhaed = 8;
+ constexpr int kTcpOverhaed = 20;
+ transport_overhead_per_packet +=
+ selected_candidate_pair_->local_candidate().protocol() ==
+ TCP_PROTOCOL_NAME
+ ? kTcpOverhaed
+ : kUdpOverhaed;
+
+ if (secure()) {
+ int srtp_overhead = 0;
+ if (srtp_filter_.GetSrtpOverhead(&srtp_overhead))
+ transport_overhead_per_packet += srtp_overhead;
+ }
+
+ return transport_overhead_per_packet;
+}
+
+void BaseChannel::UpdateTransportOverhead() {
+ int transport_overhead_per_packet = GetTransportOverheadPerPacket();
+ if (transport_overhead_per_packet)
+ invoker_.AsyncInvoke<void>(
+ RTC_FROM_HERE, worker_thread_,
+ Bind(&MediaChannel::OnTransportOverheadChanged, media_channel_,
+ transport_overhead_per_packet));
+}
+
void VoiceChannel::UpdateMediaSendRecvState_w() {
// Render incoming data if we're the active call, and we have the local
// content. We receive data on the default channel and multiplexed streams.
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698