Index: webrtc/pc/channel.cc |
diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc |
index 59fca4a9d20c287626b4f2d7abbaa33bbf79d3af..f5428a43effac7a93fce554e11946c220946337c 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; |
} |
@@ -242,7 +245,7 @@ bool BaseChannel::InitNetwork_n( |
SetTransports_n(rtp_dtls_transport, rtcp_dtls_transport, rtp_packet_transport, |
rtcp_packet_transport); |
- if (rtp_transport_.rtcp_mux_required()) { |
+ if (rtcp_mux_required_) { |
rtcp_mux_filter_.SetActive(); |
} |
return true; |
@@ -335,19 +338,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( |
@@ -374,9 +364,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; |
@@ -390,6 +380,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 { |
@@ -404,9 +395,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( |
@@ -421,7 +412,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( |
@@ -433,7 +423,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); |
} |
@@ -442,7 +431,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); |
} |
@@ -522,8 +510,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 { |
@@ -605,13 +592,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()) { |
@@ -655,22 +635,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, |
@@ -705,11 +673,7 @@ 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()) { |
+ if (!rtp_transport_.IsWritable(rtcp)) { |
return false; |
} |
@@ -805,16 +769,7 @@ 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(rtcp, packet, updated_options, flags); |
} |
bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) { |
@@ -1233,7 +1188,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'.", |
@@ -1267,7 +1222,6 @@ bool BaseChannel::SetRtcpMux_n(bool enable, |
SignalRtcpMuxFullyActive(transport_name_); |
} |
UpdateWritableState_n(); |
- SetTransportChannelReadyToSend(true, false); |
} |
break; |
case CA_UPDATE: |
@@ -1281,6 +1235,7 @@ bool BaseChannel::SetRtcpMux_n(bool enable, |
SafeSetError("Failed to setup RTCP mux filter.", error_desc); |
return false; |
} |
+ rtp_transport_.SetRtcpMuxEnabled(rtcp_mux_filter_.IsActive()); |
// |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or |
// CA_ANSWER, but we only want to tear down the RTCP transport if we received |
// a final answer. |