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

Unified Diff: webrtc/pc/channel.cc

Issue 2812243005: Move ready to send logic from BaseChannel to RtpTransport. (Closed)
Patch Set: Move Connect, Disconnect, and more ready to send logic to RtpTransport. Update tests. Introduce rtc… Created 3 years, 8 months 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
Index: webrtc/pc/channel.cc
diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc
index d45e220d5c7843b9eab9099d7ccdd58d6b4e9dc6..c4f86cee548a2b41c09c8909fe9817b3928d5901 100644
--- a/webrtc/pc/channel.cc
+++ b/webrtc/pc/channel.cc
@@ -168,6 +168,7 @@ BaseChannel::BaseChannel(rtc::Thread* worker_thread,
network_thread_(network_thread),
signaling_thread_(signaling_thread),
content_name_(content_name),
+ rtcp_mux_required_(rtcp_mux_required),
rtp_transport_(rtcp_mux_required),
srtp_required_(srtp_required),
media_channel_(media_channel),
@@ -176,6 +177,8 @@ BaseChannel::BaseChannel(rtc::Thread* worker_thread,
#if defined(ENABLE_EXTERNAL_AUTH)
srtp_filter_.EnableExternalAuth();
#endif
+ rtp_transport_.SignalReadyToSend.connect(
+ this, &BaseChannel::OnTransportReadyToSend);
LOG(LS_INFO) << "Created channel for " << content_name;
}
@@ -250,7 +253,7 @@ bool BaseChannel::InitNetwork_n(
!SetDtlsSrtpCryptoSuites_n(rtcp_dtls_transport_, true)) {
return false;
}
- if (rtp_transport_.rtcp_mux_required()) {
+ if (rtcp_mux_required_) {
rtcp_mux_filter_.SetActive();
}
return true;
@@ -343,19 +346,6 @@ void BaseChannel::SetTransports_n(
// Update aggregate writable/ready-to-send state between RTP and RTCP upon
// setting new transport channels.
UpdateWritableState_n();
- // We can only update ready-to-send after updating writability.
- //
- // On setting a new channel, assume it's ready to send if it's writable,
- // because we have no way of knowing otherwise (the channel doesn't give us
- // "was last send successful?").
- //
- // This won't always be accurate (the last SendPacket call from another
- // BaseChannel could have resulted in an error), but even so, we'll just
- // encounter the error again and update "ready to send" accordingly.
- SetTransportChannelReadyToSend(
- false, rtp_packet_transport && rtp_packet_transport->writable());
- SetTransportChannelReadyToSend(
- true, rtcp_packet_transport && rtcp_packet_transport->writable());
}
void BaseChannel::SetTransport_n(
@@ -382,9 +372,9 @@ void BaseChannel::SetTransport_n(
}
if (rtcp) {
- rtp_transport_.set_rtcp_packet_transport(new_packet_transport);
+ rtp_transport_.SetRtcpPacketTransport(new_packet_transport);
} else {
- rtp_transport_.set_rtp_packet_transport(new_packet_transport);
+ rtp_transport_.SetRtpPacketTransport(new_packet_transport);
}
old_dtls_transport = new_dtls_transport;
@@ -398,6 +388,7 @@ void BaseChannel::SetTransport_n(
<< "Setting RTCP for DTLS/SRTP after SrtpFilter is active "
<< "should never happen.";
}
+
if (new_dtls_transport) {
ConnectToDtlsTransport(new_dtls_transport);
} else {
@@ -412,9 +403,9 @@ void BaseChannel::SetTransport_n(
void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) {
RTC_DCHECK(network_thread_->IsCurrent());
+ // TODO(zstein): de-dup with ConnectToPacketTransport
transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead);
- transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend);
transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState);
transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
transport->ice_transport()->SignalSelectedCandidatePairChanged.connect(
@@ -429,7 +420,6 @@ void BaseChannel::DisconnectFromDtlsTransport(
transport->SignalWritableState.disconnect(this);
transport->SignalReadPacket.disconnect(this);
- transport->SignalReadyToSend.disconnect(this);
transport->SignalDtlsState.disconnect(this);
transport->SignalSentPacket.disconnect(this);
transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect(
@@ -441,7 +431,6 @@ void BaseChannel::ConnectToPacketTransport(
RTC_DCHECK_RUN_ON(network_thread_);
transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead);
- transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend);
transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
}
@@ -450,7 +439,6 @@ void BaseChannel::DisconnectFromPacketTransport(
RTC_DCHECK_RUN_ON(network_thread_);
transport->SignalWritableState.disconnect(this);
transport->SignalReadPacket.disconnect(this);
- transport->SignalReadyToSend.disconnect(this);
transport->SignalSentPacket.disconnect(this);
}
@@ -530,8 +518,7 @@ bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) {
bool BaseChannel::NeedsRtcpTransport() {
// If this BaseChannel doesn't require RTCP mux and we haven't fully
// negotiated RTCP mux, we need an RTCP transport.
- return !rtp_transport_.rtcp_mux_required() &&
- !rtcp_mux_filter_.IsFullyActive();
+ return !rtcp_mux_required_ && !rtcp_mux_filter_.IsFullyActive();
}
bool BaseChannel::IsReadyToReceiveMedia_w() const {
@@ -618,13 +605,6 @@ void BaseChannel::OnPacketRead(rtc::PacketTransportInternal* transport,
HandlePacket(rtcp, &packet, packet_time);
}
-void BaseChannel::OnReadyToSend(rtc::PacketTransportInternal* transport) {
- RTC_DCHECK(transport == rtp_transport_.rtp_packet_transport() ||
- transport == rtp_transport_.rtcp_packet_transport());
- SetTransportChannelReadyToSend(
- transport == rtp_transport_.rtcp_packet_transport(), true);
-}
-
void BaseChannel::OnDtlsState(DtlsTransportInternal* transport,
DtlsTransportState state) {
if (!ShouldSetupDtlsSrtp_n()) {
@@ -668,22 +648,10 @@ void BaseChannel::OnSelectedCandidatePairChanged(
network_route));
}
-void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) {
- RTC_DCHECK(network_thread_->IsCurrent());
- if (rtcp) {
- rtcp_ready_to_send_ = ready;
- } else {
- rtp_ready_to_send_ = ready;
- }
-
- bool ready_to_send =
- (rtp_ready_to_send_ &&
- // In the case of rtcp mux |rtcp_packet_transport_| will be null.
- (rtcp_ready_to_send_ || !rtp_transport_.rtcp_packet_transport()));
-
+void BaseChannel::OnTransportReadyToSend(bool ready) {
invoker_.AsyncInvoke<void>(
RTC_FROM_HERE, worker_thread_,
- Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send));
+ Bind(&MediaChannel::OnReadyToSend, media_channel_, ready));
}
bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport,
@@ -718,11 +686,8 @@ bool BaseChannel::SendPacket(bool rtcp,
// packet before doing anything. (We might get RTCP packets that we don't
// intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP
// transport.
- rtc::PacketTransportInternal* transport =
- (!rtcp || rtcp_mux_filter_.IsActive())
- ? rtp_transport_.rtp_packet_transport()
- : rtp_transport_.rtcp_packet_transport();
- if (!transport || !transport->writable()) {
+ const bool send_on_rtcp = rtcp && !rtcp_mux_filter_.IsActive();
Taylor Brandstetter 2017/04/19 05:56:33 This could be moved into RtpTransport, if rtcp_mux
Zach Stein 2017/04/20 19:59:10 Done.
+ if (!rtp_transport_.IsWritable(send_on_rtcp)) {
return false;
}
@@ -818,16 +783,8 @@ bool BaseChannel::SendPacket(bool rtcp,
// Bon voyage.
int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL;
- int ret = transport->SendPacket(packet->data<char>(), packet->size(),
- updated_options, flags);
- if (ret != static_cast<int>(packet->size())) {
- if (transport->GetError() == ENOTCONN) {
- LOG(LS_WARNING) << "Got ENOTCONN from transport.";
- SetTransportChannelReadyToSend(rtcp, false);
- }
- return false;
- }
- return true;
+ return rtp_transport_.SendPacket(send_on_rtcp, packet, updated_options,
+ flags);
}
bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) {
@@ -1259,7 +1216,7 @@ bool BaseChannel::SetRtcpMux_n(bool enable,
std::string* error_desc) {
// Provide a more specific error message for the RTCP mux "require" policy
// case.
- if (rtp_transport_.rtcp_mux_required() && !enable) {
+ if (rtcp_mux_required_ && !enable) {
SafeSetError(
"rtcpMuxPolicy is 'require', but media description does not "
"contain 'a=rtcp-mux'.",
@@ -1270,11 +1227,13 @@ bool BaseChannel::SetRtcpMux_n(bool enable,
switch (action) {
case CA_OFFER:
ret = rtcp_mux_filter_.SetOffer(enable, src);
+ // TODO(zstein): rtp_transport_.set_rtcp_mux_enabled here?
Taylor Brandstetter 2017/04/19 05:56:33 I think you could do "rtp_transport_.set_rtcp_mux_
Zach Stein 2017/04/20 19:59:10 I think that is just what I want - thanks!
break;
case CA_PRANSWER:
// This may activate RTCP muxing, but we don't yet destroy the transport
// because the final answer may deactivate it.
ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src);
+ // TODO(zstein): rtp_transport_.set_rtcp_mux_enabled here?
break;
case CA_ANSWER:
ret = rtcp_mux_filter_.SetAnswer(enable, src);
@@ -1293,7 +1252,8 @@ bool BaseChannel::SetRtcpMux_n(bool enable,
SignalRtcpMuxFullyActive(transport_name_);
}
UpdateWritableState_n();
- SetTransportChannelReadyToSend(true, false);
+ // TODO(zstein): Maybe rtcp_mux_filter should signal these changes.
Taylor Brandstetter 2017/04/19 05:56:33 Since its state will always change synchronously,
Zach Stein 2017/04/20 19:59:10 Acknowledged.
+ rtp_transport_.set_rtcp_mux_enabled(true);
}
break;
case CA_UPDATE:

Powered by Google App Engine
This is Rietveld 408576698