Chromium Code Reviews| Index: webrtc/pc/channel.cc |
| diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc |
| index f5428a43effac7a93fce554e11946c220946337c..0b1b1c9e27324a4dd76bab55b0e088d75d8a02c4 100644 |
| --- a/webrtc/pc/channel.cc |
| +++ b/webrtc/pc/channel.cc |
| @@ -105,15 +105,9 @@ struct DataChannelErrorMessageData : public rtc::MessageData { |
| DataMediaChannel::Error error; |
| }; |
| -static const char* PacketType(bool rtcp) { |
| - return (!rtcp) ? "RTP" : "RTCP"; |
| -} |
| - |
| static bool ValidPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) { |
| // Check the packet size. We could check the header too if needed. |
| - return (packet && |
| - packet->size() >= (!rtcp ? kMinRtpPacketLen : kMinRtcpPacketLen) && |
| - packet->size() <= kMaxRtpPacketLen); |
| + return packet && IsValidRtpRtcpPacketSize(rtcp, packet->size()); |
| } |
| static bool IsReceiveContentDirection(MediaContentDirection direction) { |
| @@ -179,6 +173,14 @@ BaseChannel::BaseChannel(rtc::Thread* worker_thread, |
| #endif |
| rtp_transport_.SignalReadyToSend.connect( |
| this, &BaseChannel::OnTransportReadyToSend); |
| + // TODO(zstein): RtpTransport::SignalFirstPacketReceived and |
| + // RtpTransport::SignalPacketReceived will probably be replaced with a |
| + // callback interface later so that the demuxer can select which chanenl |
|
Taylor Brandstetter
2017/05/25 16:14:25
nit: "chanenl"
Zach Stein
2017/05/30 21:50:55
Dnoe.
|
| + // to signal. |
| + rtp_transport_.SignalFirstPacketReceived.connect( |
| + this, &BaseChannel::OnFirstPacketReceived); |
| + rtp_transport_.SignalPacketReceived.connect(this, |
| + &BaseChannel::OnPacketReceived); |
| LOG(LS_INFO) << "Created channel for " << content_name; |
| } |
| @@ -397,7 +399,6 @@ void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) { |
| // TODO(zstein): de-dup with ConnectToPacketTransport |
| transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); |
| - transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); |
| transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState); |
| transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); |
| transport->ice_transport()->SignalSelectedCandidatePairChanged.connect( |
| @@ -411,7 +412,6 @@ void BaseChannel::DisconnectFromDtlsTransport( |
| false); |
| transport->SignalWritableState.disconnect(this); |
| - transport->SignalReadPacket.disconnect(this); |
| transport->SignalDtlsState.disconnect(this); |
| transport->SignalSentPacket.disconnect(this); |
| transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect( |
| @@ -422,7 +422,6 @@ void BaseChannel::ConnectToPacketTransport( |
| rtc::PacketTransportInternal* transport) { |
| RTC_DCHECK_RUN_ON(network_thread_); |
| transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); |
| - transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); |
| transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); |
| } |
| @@ -430,7 +429,6 @@ void BaseChannel::DisconnectFromPacketTransport( |
| rtc::PacketTransportInternal* transport) { |
| RTC_DCHECK_RUN_ON(network_thread_); |
| transport->SignalWritableState.disconnect(this); |
| - transport->SignalReadPacket.disconnect(this); |
| transport->SignalSentPacket.disconnect(this); |
| } |
| @@ -576,22 +574,6 @@ void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) { |
| UpdateWritableState_n(); |
| } |
| -void BaseChannel::OnPacketRead(rtc::PacketTransportInternal* transport, |
| - const char* data, |
| - size_t len, |
| - const rtc::PacketTime& packet_time, |
| - int flags) { |
| - TRACE_EVENT0("webrtc", "BaseChannel::OnPacketRead"); |
| - // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine |
| - RTC_DCHECK(network_thread_->IsCurrent()); |
| - |
| - // When using RTCP multiplexing we might get RTCP packets on the RTP |
| - // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. |
| - bool rtcp = PacketIsRtcp(transport, data, len); |
| - rtc::CopyOnWriteBuffer packet(data, len); |
| - HandlePacket(rtcp, &packet, packet_time); |
| -} |
| - |
| void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, |
| DtlsTransportState state) { |
| if (!ShouldSetupDtlsSrtp_n()) { |
| @@ -641,13 +623,6 @@ void BaseChannel::OnTransportReadyToSend(bool ready) { |
| Bind(&MediaChannel::OnReadyToSend, media_channel_, ready)); |
| } |
| -bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport, |
| - const char* data, |
| - size_t len) { |
| - return (transport == rtp_transport_.rtcp_packet_transport() || |
| - rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); |
| -} |
| - |
| bool BaseChannel::SendPacket(bool rtcp, |
| rtc::CopyOnWriteBuffer* packet, |
| const rtc::PacketOptions& options) { |
| @@ -772,41 +747,18 @@ bool BaseChannel::SendPacket(bool rtcp, |
| return rtp_transport_.SendPacket(rtcp, packet, updated_options, flags); |
| } |
| -bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) { |
| - // Protect ourselves against crazy data. |
| - if (!ValidPacket(rtcp, packet)) { |
| - LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " " |
| - << PacketType(rtcp) |
| - << " packet: wrong size=" << packet->size(); |
| - return false; |
| - } |
| - if (rtcp) { |
| - // Permit all (seemingly valid) RTCP packets. |
| - return true; |
| - } |
| - // Check whether we handle this payload. |
| - return bundle_filter_.DemuxPacket(packet->data(), packet->size()); |
| +bool BaseChannel::HandlesPayloadType(int packet_type) const { |
| + return rtp_transport_.HandlesPayloadType(packet_type); |
| } |
| -void BaseChannel::HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, |
| - const rtc::PacketTime& packet_time) { |
| - RTC_DCHECK(network_thread_->IsCurrent()); |
| - if (!WantsPacket(rtcp, packet)) { |
| - return; |
| - } |
| - |
| - // We are only interested in the first rtp packet because that |
| - // indicates the media has started flowing. |
| - if (!has_received_packet_ && !rtcp) { |
| - has_received_packet_ = true; |
| - signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED); |
| - } |
| - |
| +void BaseChannel::OnPacketReceived(bool rtcp, |
| + rtc::CopyOnWriteBuffer& packet, |
| + const rtc::PacketTime& packet_time) { |
| // Unprotect the packet, if needed. |
| if (srtp_filter_.IsActive()) { |
| TRACE_EVENT0("webrtc", "SRTP Decode"); |
| - char* data = packet->data<char>(); |
| - int len = static_cast<int>(packet->size()); |
| + char* data = packet.data<char>(); |
| + int len = static_cast<int>(packet.size()); |
| bool res; |
| if (!rtcp) { |
| res = srtp_filter_.UnprotectRtp(data, len, &len); |
| @@ -816,8 +768,8 @@ void BaseChannel::HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, |
| GetRtpSeqNum(data, len, &seq_num); |
| GetRtpSsrc(data, len, &ssrc); |
| LOG(LS_ERROR) << "Failed to unprotect " << content_name_ |
| - << " RTP packet: size=" << len |
| - << ", seqnum=" << seq_num << ", SSRC=" << ssrc; |
| + << " RTP packet: size=" << len << ", seqnum=" << seq_num |
| + << ", SSRC=" << ssrc; |
| return; |
| } |
| } else { |
| @@ -831,7 +783,7 @@ void BaseChannel::HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, |
| } |
| } |
| - packet->SetSize(len); |
| + packet.SetSize(len); |
| } else if (srtp_required_) { |
| // Our session description indicates that SRTP is required, but we got a |
| // packet before our SRTP filter is active. This means either that |
| @@ -851,13 +803,14 @@ void BaseChannel::HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, |
| invoker_.AsyncInvoke<void>( |
| RTC_FROM_HERE, worker_thread_, |
| - Bind(&BaseChannel::OnPacketReceived, this, rtcp, *packet, packet_time)); |
| + Bind(&BaseChannel::ProcessPacket, this, rtcp, packet, packet_time)); |
| } |
| -void BaseChannel::OnPacketReceived(bool rtcp, |
| - const rtc::CopyOnWriteBuffer& packet, |
| - const rtc::PacketTime& packet_time) { |
| +void BaseChannel::ProcessPacket(bool rtcp, |
| + const rtc::CopyOnWriteBuffer& packet, |
| + const rtc::PacketTime& packet_time) { |
| RTC_DCHECK(worker_thread_->IsCurrent()); |
| + |
| // Need to copy variable because OnRtcpReceived/OnPacketReceived |
| // requires non-const pointer to buffer. This doesn't memcpy the actual data. |
| rtc::CopyOnWriteBuffer data(packet); |
| @@ -1448,6 +1401,10 @@ void BaseChannel::OnMessage(rtc::Message *pmsg) { |
| } |
| } |
| +void BaseChannel::AddHandledPayloadType(int payload_type) { |
| + rtp_transport_.AddHandledPayloadType(payload_type); |
| +} |
| + |
| void BaseChannel::FlushRtcpMessages_n() { |
| // Flush all remaining RTCP messages. This should only be called in |
| // destructor. |
| @@ -1489,8 +1446,7 @@ VoiceChannel::VoiceChannel(rtc::Thread* worker_thread, |
| content_name, |
| rtcp_mux_required, |
| srtp_required), |
| - media_engine_(media_engine), |
| - received_media_(false) {} |
| + media_engine_(media_engine) {} |
| VoiceChannel::~VoiceChannel() { |
| TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel"); |
| @@ -1659,19 +1615,6 @@ void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) { |
| media_channel()->GetActiveStreams(actives); |
| } |
| -void VoiceChannel::OnPacketRead(rtc::PacketTransportInternal* transport, |
| - const char* data, |
| - size_t len, |
| - const rtc::PacketTime& packet_time, |
| - int flags) { |
| - BaseChannel::OnPacketRead(transport, data, len, packet_time, flags); |
| - // Set a flag when we've received an RTP packet. If we're waiting for early |
| - // media, this will disable the timeout. |
| - if (!received_media_ && !PacketIsRtcp(transport, data, len)) { |
| - received_media_ = true; |
| - } |
| -} |
| - |
| void BaseChannel::UpdateMediaSendRecvState() { |
| RTC_DCHECK(network_thread_->IsCurrent()); |
| invoker_.AsyncInvoke<void>( |
| @@ -1720,6 +1663,10 @@ void BaseChannel::UpdateTransportOverhead() { |
| transport_overhead_per_packet)); |
| } |
| +void BaseChannel::OnFirstPacketReceived() { |
| + signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED); |
| +} |
| + |
| void VoiceChannel::UpdateMediaSendRecvState_w() { |
| // Render incoming data if we're the active call, and we have the local |
| // content. We receive data on the default channel and multiplexed streams. |
| @@ -1766,7 +1713,7 @@ bool VoiceChannel::SetLocalContent_w(const MediaContentDescription* content, |
| return false; |
| } |
| for (const AudioCodec& codec : audio->codecs()) { |
| - bundle_filter()->AddPayloadType(codec.id); |
| + AddHandledPayloadType(codec.id); |
| } |
| last_recv_params_ = recv_params; |
| @@ -1837,7 +1784,7 @@ bool VoiceChannel::SetRemoteContent_w(const MediaContentDescription* content, |
| void VoiceChannel::HandleEarlyMediaTimeout() { |
| // This occurs on the main thread, not the worker thread. |
| - if (!received_media_) { |
| + if (!received_media()) { |
| LOG(LS_INFO) << "No early media received before timeout"; |
| SignalEarlyMediaTimeout(this); |
| } |
| @@ -2039,7 +1986,7 @@ bool VideoChannel::SetLocalContent_w(const MediaContentDescription* content, |
| return false; |
| } |
| for (const VideoCodec& codec : video->codecs()) { |
| - bundle_filter()->AddPayloadType(codec.id); |
| + AddHandledPayloadType(codec.id); |
| } |
| last_recv_params_ = recv_params; |
| @@ -2234,7 +2181,7 @@ bool RtpDataChannel::SetLocalContent_w(const MediaContentDescription* content, |
| return false; |
| } |
| for (const DataCodec& codec : data->codecs()) { |
| - bundle_filter()->AddPayloadType(codec.id); |
| + AddHandledPayloadType(codec.id); |
| } |
| last_recv_params_ = recv_params; |