| Index: webrtc/pc/rtptransport.cc
|
| diff --git a/webrtc/pc/rtptransport.cc b/webrtc/pc/rtptransport.cc
|
| index 76bc639cbcfb3685e40ef46bb605d1198225f4d3..2ee27e02fb673725ec3c66ab9260d723d6083dda 100644
|
| --- a/webrtc/pc/rtptransport.cc
|
| +++ b/webrtc/pc/rtptransport.cc
|
| @@ -11,18 +11,80 @@
|
| #include "webrtc/pc/rtptransport.h"
|
|
|
| #include "webrtc/base/checks.h"
|
| +#include "webrtc/base/copyonwritebuffer.h"
|
| #include "webrtc/p2p/base/packettransportinterface.h"
|
|
|
| namespace webrtc {
|
|
|
| -void RtpTransport::set_rtp_packet_transport(rtc::PacketTransportInternal* rtp) {
|
| - rtp_packet_transport_ = rtp;
|
| +void RtpTransport::SetRtcpMuxEnabled(bool enable) {
|
| + rtcp_mux_enabled_ = enable;
|
| + MaybeSignalReadyToSend();
|
| }
|
|
|
| -void RtpTransport::set_rtcp_packet_transport(
|
| - rtc::PacketTransportInternal* rtcp) {
|
| - RTC_DCHECK(!rtcp_mux_required_);
|
| - rtcp_packet_transport_ = rtcp;
|
| +void RtpTransport::SetRtpPacketTransport(
|
| + rtc::PacketTransportInternal* new_packet_transport) {
|
| + if (new_packet_transport == rtp_packet_transport_) {
|
| + return;
|
| + }
|
| + if (rtp_packet_transport_) {
|
| + rtp_packet_transport_->SignalReadyToSend.disconnect(this);
|
| + }
|
| + if (new_packet_transport) {
|
| + new_packet_transport->SignalReadyToSend.connect(
|
| + this, &RtpTransport::OnReadyToSend);
|
| + }
|
| + rtp_packet_transport_ = new_packet_transport;
|
| +
|
| + // Assumes the transport is ready to send if it is writable. If we are wrong,
|
| + // ready to send will be updated the next time we try to send.
|
| + SetReadyToSend(false,
|
| + rtp_packet_transport_ && rtp_packet_transport_->writable());
|
| +}
|
| +
|
| +void RtpTransport::SetRtcpPacketTransport(
|
| + rtc::PacketTransportInternal* new_packet_transport) {
|
| + if (new_packet_transport == rtcp_packet_transport_) {
|
| + return;
|
| + }
|
| + if (rtcp_packet_transport_) {
|
| + rtcp_packet_transport_->SignalReadyToSend.disconnect(this);
|
| + }
|
| + if (new_packet_transport) {
|
| + new_packet_transport->SignalReadyToSend.connect(
|
| + this, &RtpTransport::OnReadyToSend);
|
| + }
|
| + rtcp_packet_transport_ = new_packet_transport;
|
| +
|
| + // Assumes the transport is ready to send if it is writable. If we are wrong,
|
| + // ready to send will be updated the next time we try to send.
|
| + SetReadyToSend(true,
|
| + rtcp_packet_transport_ && rtcp_packet_transport_->writable());
|
| +}
|
| +
|
| +bool RtpTransport::IsWritable(bool rtcp) const {
|
| + rtc::PacketTransportInternal* transport = rtcp && !rtcp_mux_enabled_
|
| + ? rtcp_packet_transport_
|
| + : rtp_packet_transport_;
|
| + return transport && transport->writable();
|
| +}
|
| +
|
| +bool RtpTransport::SendPacket(bool rtcp,
|
| + const rtc::CopyOnWriteBuffer* packet,
|
| + const rtc::PacketOptions& options,
|
| + int flags) {
|
| + rtc::PacketTransportInternal* transport = rtcp && !rtcp_mux_enabled_
|
| + ? rtcp_packet_transport_
|
| + : rtp_packet_transport_;
|
| + int ret = transport->SendPacket(packet->data<char>(), packet->size(), options,
|
| + flags);
|
| + if (ret != static_cast<int>(packet->size())) {
|
| + if (transport->GetError() == ENOTCONN) {
|
| + LOG(LS_WARNING) << "Got ENOTCONN from transport.";
|
| + SetReadyToSend(rtcp, false);
|
| + }
|
| + return false;
|
| + }
|
| + return true;
|
| }
|
|
|
| PacketTransportInterface* RtpTransport::GetRtpPacketTransport() const {
|
| @@ -57,4 +119,27 @@ RtpTransportAdapter* RtpTransport::GetInternal() {
|
| return nullptr;
|
| }
|
|
|
| +void RtpTransport::OnReadyToSend(rtc::PacketTransportInternal* transport) {
|
| + SetReadyToSend(transport == rtcp_packet_transport_, true);
|
| +}
|
| +
|
| +void RtpTransport::SetReadyToSend(bool rtcp, bool ready) {
|
| + if (rtcp) {
|
| + rtcp_ready_to_send_ = ready;
|
| + } else {
|
| + rtp_ready_to_send_ = ready;
|
| + }
|
| +
|
| + MaybeSignalReadyToSend();
|
| +}
|
| +
|
| +void RtpTransport::MaybeSignalReadyToSend() {
|
| + bool ready_to_send =
|
| + rtp_ready_to_send_ && (rtcp_ready_to_send_ || rtcp_mux_enabled_);
|
| + if (ready_to_send != ready_to_send_) {
|
| + ready_to_send_ = ready_to_send;
|
| + SignalReadyToSend(ready_to_send);
|
| + }
|
| +}
|
| +
|
| } // namespace webrtc
|
|
|