| Index: webrtc/pc/channel.cc
|
| diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc
|
| index ecc1c9a633c6d4a935a146f048483256ccdc5d49..563464833644feb19770888d9ff3e9ad5a9dfaa2 100644
|
| --- a/webrtc/pc/channel.cc
|
| +++ b/webrtc/pc/channel.cc
|
| @@ -167,7 +167,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),
|
| selected_candidate_pair_(nullptr) {
|
| @@ -201,13 +201,13 @@ void BaseChannel::DisconnectTransportChannels_n() {
|
| // media_channel may use them from a different thread.
|
| if (rtp_dtls_transport_) {
|
| DisconnectFromDtlsTransport(rtp_dtls_transport_);
|
| - } else if (rtp_packet_transport_) {
|
| - DisconnectFromPacketTransport(rtp_packet_transport_);
|
| + } else if (rtp_transport_.rtp_packet_transport()) {
|
| + DisconnectFromPacketTransport(rtp_transport_.rtp_packet_transport());
|
| }
|
| if (rtcp_dtls_transport_) {
|
| DisconnectFromDtlsTransport(rtcp_dtls_transport_);
|
| - } else if (rtcp_packet_transport_) {
|
| - DisconnectFromPacketTransport(rtcp_packet_transport_);
|
| + } else if (rtp_transport_.rtcp_packet_transport()) {
|
| + DisconnectFromPacketTransport(rtp_transport_.rtcp_packet_transport());
|
| }
|
|
|
| // Clear pending read packets/messages.
|
| @@ -249,7 +249,7 @@ bool BaseChannel::InitNetwork_n(
|
| !SetDtlsSrtpCryptoSuites_n(rtcp_dtls_transport_, true)) {
|
| return false;
|
| }
|
| - if (rtcp_mux_required_) {
|
| + if (rtp_transport_.rtcp_mux_required()) {
|
| rtcp_mux_filter_.SetActive();
|
| }
|
| return true;
|
| @@ -295,7 +295,7 @@ void BaseChannel::SetTransports_n(
|
| RTC_DCHECK(rtp_dtls_transport == rtp_packet_transport);
|
| RTC_DCHECK(rtcp_dtls_transport == rtcp_packet_transport);
|
| // Can't go from non-DTLS to DTLS.
|
| - RTC_DCHECK(!rtp_packet_transport_ || rtp_dtls_transport_);
|
| + RTC_DCHECK(!rtp_transport_.rtp_packet_transport() || rtp_dtls_transport_);
|
| } else {
|
| // Can't go from DTLS to non-DTLS.
|
| RTC_DCHECK(!rtp_dtls_transport_);
|
| @@ -312,7 +312,7 @@ void BaseChannel::SetTransports_n(
|
| } else {
|
| debug_name = rtp_packet_transport->debug_name();
|
| }
|
| - if (rtp_packet_transport == rtp_packet_transport_) {
|
| + if (rtp_packet_transport == rtp_transport_.rtp_packet_transport()) {
|
| // Nothing to do if transport isn't changing.
|
| return;
|
| }
|
| @@ -352,9 +352,9 @@ void BaseChannel::SetTransports_n(
|
| // 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());
|
| + false, rtp_packet_transport && rtp_packet_transport->writable());
|
| SetTransportChannelReadyToSend(
|
| - true, rtcp_packet_transport_ && rtcp_packet_transport_->writable());
|
| + true, rtcp_packet_transport && rtcp_packet_transport->writable());
|
| }
|
|
|
| void BaseChannel::SetTransport_n(
|
| @@ -364,8 +364,9 @@ void BaseChannel::SetTransport_n(
|
| RTC_DCHECK(network_thread_->IsCurrent());
|
| DtlsTransportInternal*& old_dtls_transport =
|
| rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_;
|
| - rtc::PacketTransportInternal*& old_packet_transport =
|
| - rtcp ? rtcp_packet_transport_ : rtp_packet_transport_;
|
| + rtc::PacketTransportInternal* old_packet_transport =
|
| + rtcp ? rtp_transport_.rtcp_packet_transport()
|
| + : rtp_transport_.rtp_packet_transport();
|
|
|
| if (!old_packet_transport && !new_packet_transport) {
|
| // Nothing to do.
|
| @@ -379,7 +380,11 @@ void BaseChannel::SetTransport_n(
|
| DisconnectFromPacketTransport(old_packet_transport);
|
| }
|
|
|
| - old_packet_transport = new_packet_transport;
|
| + if (rtcp) {
|
| + rtp_transport_.set_rtcp_packet_transport(new_packet_transport);
|
| + } else {
|
| + rtp_transport_.set_rtp_packet_transport(new_packet_transport);
|
| + }
|
| old_dtls_transport = new_dtls_transport;
|
|
|
| // If there's no new transport, we're done after disconnecting from old one.
|
| @@ -524,7 +529,8 @@ 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 !rtcp_mux_required_ && !rtcp_mux_filter_.IsFullyActive();
|
| + return !rtp_transport_.rtcp_mux_required() &&
|
| + !rtcp_mux_filter_.IsFullyActive();
|
| }
|
|
|
| bool BaseChannel::IsReadyToReceiveMedia_w() const {
|
| @@ -570,12 +576,12 @@ int BaseChannel::SetOption_n(SocketType type,
|
| rtc::PacketTransportInternal* transport = nullptr;
|
| switch (type) {
|
| case ST_RTP:
|
| - transport = rtp_packet_transport_;
|
| + transport = rtp_transport_.rtp_packet_transport();
|
| socket_options_.push_back(
|
| std::pair<rtc::Socket::Option, int>(opt, value));
|
| break;
|
| case ST_RTCP:
|
| - transport = rtcp_packet_transport_;
|
| + transport = rtp_transport_.rtcp_packet_transport();
|
| rtcp_socket_options_.push_back(
|
| std::pair<rtc::Socket::Option, int>(opt, value));
|
| break;
|
| @@ -589,8 +595,8 @@ bool BaseChannel::SetCryptoOptions(const rtc::CryptoOptions& crypto_options) {
|
| }
|
|
|
| void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) {
|
| - RTC_DCHECK(transport == rtp_packet_transport_ ||
|
| - transport == rtcp_packet_transport_);
|
| + RTC_DCHECK(transport == rtp_transport_.rtp_packet_transport() ||
|
| + transport == rtp_transport_.rtcp_packet_transport());
|
| RTC_DCHECK(network_thread_->IsCurrent());
|
| UpdateWritableState_n();
|
| }
|
| @@ -612,9 +618,10 @@ void BaseChannel::OnPacketRead(rtc::PacketTransportInternal* transport,
|
| }
|
|
|
| void BaseChannel::OnReadyToSend(rtc::PacketTransportInternal* transport) {
|
| - RTC_DCHECK(transport == rtp_packet_transport_ ||
|
| - transport == rtcp_packet_transport_);
|
| - SetTransportChannelReadyToSend(transport == rtcp_packet_transport_, true);
|
| + 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,
|
| @@ -671,7 +678,7 @@ void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool 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_ || !rtcp_packet_transport_));
|
| + (rtcp_ready_to_send_ || !rtp_transport_.rtcp_packet_transport()));
|
|
|
| invoker_.AsyncInvoke<void>(
|
| RTC_FROM_HERE, worker_thread_,
|
| @@ -681,7 +688,7 @@ void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) {
|
| bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport,
|
| const char* data,
|
| size_t len) {
|
| - return (transport == rtcp_packet_transport_ ||
|
| + return (transport == rtp_transport_.rtcp_packet_transport() ||
|
| rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len)));
|
| }
|
|
|
| @@ -711,8 +718,9 @@ bool BaseChannel::SendPacket(bool rtcp,
|
| // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP
|
| // transport.
|
| rtc::PacketTransportInternal* transport =
|
| - (!rtcp || rtcp_mux_filter_.IsActive()) ? rtp_packet_transport_
|
| - : rtcp_packet_transport_;
|
| + (!rtcp || rtcp_mux_filter_.IsActive())
|
| + ? rtp_transport_.rtp_packet_transport()
|
| + : rtp_transport_.rtcp_packet_transport();
|
| if (!transport || !transport->writable()) {
|
| return false;
|
| }
|
| @@ -966,8 +974,12 @@ void BaseChannel::DisableMedia_w() {
|
| }
|
|
|
| void BaseChannel::UpdateWritableState_n() {
|
| - if (rtp_packet_transport_ && rtp_packet_transport_->writable() &&
|
| - (!rtcp_packet_transport_ || rtcp_packet_transport_->writable())) {
|
| + rtc::PacketTransportInternal* rtp_packet_transport =
|
| + rtp_transport_.rtp_packet_transport();
|
| + rtc::PacketTransportInternal* rtcp_packet_transport =
|
| + rtp_transport_.rtcp_packet_transport();
|
| + if (rtp_packet_transport && rtp_packet_transport->writable() &&
|
| + (!rtcp_packet_transport || rtcp_packet_transport->writable())) {
|
| ChannelWritable_n();
|
| } else {
|
| ChannelNotWritable_n();
|
| @@ -1246,7 +1258,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 (rtcp_mux_required_ && !enable) {
|
| + if (rtp_transport_.rtcp_mux_required() && !enable) {
|
| SafeSetError(
|
| "rtcpMuxPolicy is 'require', but media description does not "
|
| "contain 'a=rtcp-mux'.",
|
| @@ -1268,13 +1280,14 @@ bool BaseChannel::SetRtcpMux_n(bool enable,
|
| if (ret && rtcp_mux_filter_.IsActive()) {
|
| // We permanently activated RTCP muxing; signal that we no longer need
|
| // the RTCP transport.
|
| - std::string debug_name = transport_name_.empty()
|
| - ? rtp_packet_transport_->debug_name()
|
| - : transport_name_;
|
| + std::string debug_name =
|
| + transport_name_.empty()
|
| + ? rtp_transport_.rtp_packet_transport()->debug_name()
|
| + : transport_name_;
|
| ;
|
| LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
|
| << "; no longer need RTCP transport for " << debug_name;
|
| - if (rtcp_packet_transport_) {
|
| + if (rtp_transport_.rtcp_packet_transport()) {
|
| SetTransport_n(true, nullptr, nullptr);
|
| SignalRtcpMuxFullyActive(transport_name_);
|
| }
|
| @@ -1298,7 +1311,7 @@ bool BaseChannel::SetRtcpMux_n(bool enable,
|
| // a final answer.
|
| if (rtcp_mux_filter_.IsActive()) {
|
| // If the RTP transport is already writable, then so are we.
|
| - if (rtp_packet_transport_->writable()) {
|
| + if (rtp_transport_.rtp_packet_transport()->writable()) {
|
| ChannelWritable_n();
|
| }
|
| }
|
|
|