Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/pc/rtptransport.h" | 11 #include "webrtc/pc/rtptransport.h" |
| 12 | 12 |
| 13 #include "webrtc/base/checks.h" | 13 #include "webrtc/base/checks.h" |
| 14 #include "webrtc/base/copyonwritebuffer.h" | |
| 14 #include "webrtc/p2p/base/packettransportinterface.h" | 15 #include "webrtc/p2p/base/packettransportinterface.h" |
| 15 | 16 |
| 16 namespace webrtc { | 17 namespace webrtc { |
| 17 | 18 |
| 18 void RtpTransport::set_rtp_packet_transport(rtc::PacketTransportInternal* rtp) { | 19 void RtpTransport::SetRtpPacketTransport( |
| 19 rtp_packet_transport_ = rtp; | 20 rtc::PacketTransportInternal* new_packet_transport) { |
| 21 if (new_packet_transport == rtp_packet_transport_) { | |
| 22 return; | |
| 23 } | |
| 24 if (rtp_packet_transport_) { | |
| 25 rtp_packet_transport_->SignalReadyToSend.disconnect(this); | |
| 26 } | |
| 27 if (new_packet_transport) { | |
| 28 new_packet_transport->SignalReadyToSend.connect( | |
| 29 this, &RtpTransport::OnReadyToSend); | |
| 30 } | |
| 31 rtp_packet_transport_ = new_packet_transport; | |
| 32 | |
| 33 // Assumes the transport is ready to send if it is writable. If we are wrong, | |
| 34 // ready to send will be updated the next time we try to send. | |
| 35 SetReadyToSend(false, | |
| 36 rtp_packet_transport_ && rtp_packet_transport_->writable()); | |
| 20 } | 37 } |
| 21 | 38 |
| 22 void RtpTransport::set_rtcp_packet_transport( | 39 void RtpTransport::SetRtcpPacketTransport( |
| 23 rtc::PacketTransportInternal* rtcp) { | 40 rtc::PacketTransportInternal* new_packet_transport) { |
| 24 RTC_DCHECK(!rtcp_mux_required_); | 41 RTC_DCHECK(!new_packet_transport || !rtcp_mux_enabled_); |
| 25 rtcp_packet_transport_ = rtcp; | 42 |
| 43 if (new_packet_transport == rtcp_packet_transport_) { | |
| 44 return; | |
| 45 } | |
| 46 if (rtcp_packet_transport_) { | |
| 47 rtcp_packet_transport_->SignalReadyToSend.disconnect(this); | |
| 48 } | |
| 49 if (new_packet_transport) { | |
| 50 new_packet_transport->SignalReadyToSend.connect( | |
| 51 this, &RtpTransport::OnReadyToSend); | |
| 52 } | |
| 53 rtcp_packet_transport_ = new_packet_transport; | |
| 54 | |
| 55 // Assumes the transport is ready to send if it is writable. If we are wrong, | |
| 56 // ready to send will be updated the next time we try to send. | |
| 57 SetReadyToSend(true, | |
| 58 rtcp_packet_transport_ && rtcp_packet_transport_->writable()); | |
| 59 } | |
| 60 | |
| 61 bool RtpTransport::IsWritable(bool send_on_rtcp) const { | |
| 62 // TODO(zstein): Use rtcp_mux_enabled_ instead of send_on_rtcp | |
|
Taylor Brandstetter
2017/04/19 05:56:33
Could this be done in this CL?
Zach Stein
2017/04/20 19:59:10
Yup, I was just looking for advice on when to set
| |
| 63 rtc::PacketTransportInternal* transport = | |
| 64 send_on_rtcp ? rtcp_packet_transport_ : rtp_packet_transport_; | |
| 65 return transport && transport->writable(); | |
| 66 } | |
| 67 | |
| 68 bool RtpTransport::SendPacket(bool send_on_rtcp, | |
| 69 const rtc::CopyOnWriteBuffer* packet, | |
| 70 const rtc::PacketOptions& options, | |
| 71 int flags) { | |
| 72 // TODO(zstein): Use rtcp_mux_enabled_ instead of send_on_rtcp | |
| 73 rtc::PacketTransportInternal* transport = | |
| 74 send_on_rtcp ? rtcp_packet_transport_ : rtp_packet_transport_; | |
| 75 int ret = transport->SendPacket(packet->data<char>(), packet->size(), options, | |
| 76 flags); | |
| 77 if (ret != static_cast<int>(packet->size())) { | |
| 78 if (transport->GetError() == ENOTCONN) { | |
| 79 LOG(LS_WARNING) << "Got ENOTCONN from transport."; | |
| 80 SetReadyToSend(send_on_rtcp, false); | |
| 81 } | |
| 82 return false; | |
| 83 } | |
| 84 return true; | |
| 26 } | 85 } |
| 27 | 86 |
| 28 PacketTransportInterface* RtpTransport::GetRtpPacketTransport() const { | 87 PacketTransportInterface* RtpTransport::GetRtpPacketTransport() const { |
| 29 return rtp_packet_transport_; | 88 return rtp_packet_transport_; |
| 30 } | 89 } |
| 31 | 90 |
| 32 PacketTransportInterface* RtpTransport::GetRtcpPacketTransport() const { | 91 PacketTransportInterface* RtpTransport::GetRtcpPacketTransport() const { |
| 33 return rtcp_packet_transport_; | 92 return rtcp_packet_transport_; |
| 34 } | 93 } |
| 35 | 94 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 50 } | 109 } |
| 51 | 110 |
| 52 RtcpParameters RtpTransport::GetRtcpParameters() const { | 111 RtcpParameters RtpTransport::GetRtcpParameters() const { |
| 53 return rtcp_parameters_; | 112 return rtcp_parameters_; |
| 54 } | 113 } |
| 55 | 114 |
| 56 RtpTransportAdapter* RtpTransport::GetInternal() { | 115 RtpTransportAdapter* RtpTransport::GetInternal() { |
| 57 return nullptr; | 116 return nullptr; |
| 58 } | 117 } |
| 59 | 118 |
| 119 void RtpTransport::OnReadyToSend(rtc::PacketTransportInternal* transport) { | |
| 120 SetReadyToSend(transport == rtcp_packet_transport_, true); | |
| 121 } | |
| 122 | |
| 123 void RtpTransport::SetReadyToSend(bool rtcp, bool ready) { | |
| 124 if (rtcp) { | |
| 125 rtcp_ready_to_send_ = ready; | |
| 126 } else { | |
| 127 rtp_ready_to_send_ = ready; | |
| 128 } | |
| 129 | |
| 130 bool ready_to_send = | |
| 131 rtp_ready_to_send_ && (rtcp_ready_to_send_ || rtcp_mux_enabled_); | |
| 132 SignalReadyToSend(ready_to_send); | |
|
Taylor Brandstetter
2017/04/19 05:56:33
nit: Would be preferable if this signal only fired
Zach Stein
2017/04/20 19:59:11
Done.
| |
| 133 } | |
| 134 | |
| 60 } // namespace webrtc | 135 } // namespace webrtc |
| OLD | NEW |