diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc index 2fe199f698..9bc9468336 100644 --- a/webrtc/audio/audio_receive_stream.cc +++ b/webrtc/audio/audio_receive_stream.cc @@ -298,14 +298,12 @@ bool AudioReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) { return channel_proxy_->ReceivedRTCPPacket(packet, length); } -bool AudioReceiveStream::DeliverRtp(const uint8_t* packet, - size_t length, - const PacketTime& packet_time) { +void AudioReceiveStream::OnRtpPacket(const RtpPacketReceived& packet) { // TODO(solenberg): Tests call this function on a network thread, libjingle // calls on the worker thread. We should move towards always using a network // thread. Then this check can be enabled. // RTC_DCHECK(!thread_checker_.CalledOnValidThread()); - return channel_proxy_->ReceivedRTPPacket(packet, length, packet_time); + channel_proxy_->OnRtpPacket(packet); } const webrtc::AudioReceiveStream::Config& AudioReceiveStream::config() const { diff --git a/webrtc/audio/audio_receive_stream.h b/webrtc/audio/audio_receive_stream.h index 0792e243b0..e344e229a4 100644 --- a/webrtc/audio/audio_receive_stream.h +++ b/webrtc/audio/audio_receive_stream.h @@ -23,6 +23,7 @@ namespace webrtc { class PacketRouter; class RtcEventLog; +class RtpPacketReceived; namespace voe { class ChannelProxy; @@ -48,6 +49,9 @@ class AudioReceiveStream final : public webrtc::AudioReceiveStream, void SetSink(std::unique_ptr sink) override; void SetGain(float gain) override; + // TODO(nisse): Intended to be part of an RtpPacketReceiver interface. + void OnRtpPacket(const RtpPacketReceived& packet); + // AudioMixer::Source AudioFrameInfo GetAudioFrameWithInfo(int sample_rate_hz, AudioFrame* audio_frame) override; @@ -63,9 +67,6 @@ class AudioReceiveStream final : public webrtc::AudioReceiveStream, void AssociateSendStream(AudioSendStream* send_stream); void SignalNetworkState(NetworkState state); bool DeliverRtcp(const uint8_t* packet, size_t length); - bool DeliverRtp(const uint8_t* packet, - size_t length, - const PacketTime& packet_time); const webrtc::AudioReceiveStream::Config& config() const; private: diff --git a/webrtc/audio/audio_receive_stream_unittest.cc b/webrtc/audio/audio_receive_stream_unittest.cc index 2f5998c9ff..b28c62a627 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -246,13 +246,15 @@ TEST(AudioReceiveStreamTest, ReceiveRtpPacket) { std::vector rtp_packet = CreateRtpHeaderWithOneByteExtension( kTransportSequenceNumberId, kTransportSequenceNumberValue, 2); PacketTime packet_time(5678000, 0); + + RtpPacketReceived parsed_packet; + ASSERT_TRUE(parsed_packet.Parse(&rtp_packet[0], rtp_packet.size())); + parsed_packet.set_arrival_time_ms((packet_time.timestamp + 500) / 1000); + EXPECT_CALL(*helper.channel_proxy(), - ReceivedRTPPacket(&rtp_packet[0], - rtp_packet.size(), - _)) - .WillOnce(Return(true)); - EXPECT_TRUE( - recv_stream.DeliverRtp(&rtp_packet[0], rtp_packet.size(), packet_time)); + OnRtpPacket(testing::Ref(parsed_packet))); + + recv_stream.OnRtpPacket(parsed_packet); } TEST(AudioReceiveStreamTest, ReceiveRtcpPacket) { diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc index bb13d558ab..38dca03ff9 100644 --- a/webrtc/call/call.cc +++ b/webrtc/call/call.cc @@ -1198,12 +1198,9 @@ PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type, if (it != audio_receive_ssrcs_.end()) { received_bytes_per_second_counter_.Add(static_cast(length)); received_audio_bytes_per_second_counter_.Add(static_cast(length)); - auto status = it->second->DeliverRtp(packet, length, packet_time) - ? DELIVERY_OK - : DELIVERY_PACKET_ERROR; - if (status == DELIVERY_OK) - event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); - return status; + it->second->OnRtpPacket(*parsed_packet); + event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); + return DELIVERY_OK; } } if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) { diff --git a/webrtc/test/mock_voe_channel_proxy.h b/webrtc/test/mock_voe_channel_proxy.h index 7932473dd3..a2053f04a6 100644 --- a/webrtc/test/mock_voe_channel_proxy.h +++ b/webrtc/test/mock_voe_channel_proxy.h @@ -15,6 +15,7 @@ #include "webrtc/test/gmock.h" #include "webrtc/voice_engine/channel_proxy.h" +#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" namespace webrtc { namespace test { @@ -52,9 +53,7 @@ class MockVoEChannelProxy : public voe::ChannelProxy { MOCK_METHOD1(SetInputMute, void(bool muted)); MOCK_METHOD1(RegisterExternalTransport, void(Transport* transport)); MOCK_METHOD0(DeRegisterExternalTransport, void()); - MOCK_METHOD3(ReceivedRTPPacket, bool(const uint8_t* packet, - size_t length, - const PacketTime& packet_time)); + MOCK_METHOD1(OnRtpPacket, void(const RtpPacketReceived& packet)); MOCK_METHOD2(ReceivedRTCPPacket, bool(const uint8_t* packet, size_t length)); MOCK_CONST_METHOD0(GetAudioDecoderFactory, const rtc::scoped_refptr&()); diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc index dc5ddcae73..14ce5da7fb 100644 --- a/webrtc/voice_engine/channel.cc +++ b/webrtc/voice_engine/channel.cc @@ -32,6 +32,7 @@ #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" +#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h" #include "webrtc/modules/utility/include/process_thread.h" #include "webrtc/system_wrappers/include/trace.h" @@ -1560,31 +1561,49 @@ int32_t Channel::DeRegisterExternalTransport() { return 0; } +// TODO(nisse): Delete this method together with ReceivedRTPPacket. +// It's a temporary hack to support both ReceivedRTPPacket and +// OnRtpPacket interfaces without too much code duplication. +bool Channel::OnRtpPacketWithHeader(const uint8_t* received_packet, + size_t length, + RTPHeader *header) { + // Store playout timestamp for the received RTP packet + UpdatePlayoutTimestamp(false); + + header->payload_type_frequency = + rtp_payload_registry_->GetPayloadTypeFrequency(header->payloadType); + if (header->payload_type_frequency < 0) + return false; + bool in_order = IsPacketInOrder(*header); + rtp_receive_statistics_->IncomingPacket( + *header, length, IsPacketRetransmitted(*header, in_order)); + rtp_payload_registry_->SetIncomingPayloadType(*header); + + return ReceivePacket(received_packet, length, *header, in_order); +} + int32_t Channel::ReceivedRTPPacket(const uint8_t* received_packet, size_t length, const PacketTime& packet_time) { WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), "Channel::ReceivedRTPPacket()"); - // Store playout timestamp for the received RTP packet - UpdatePlayoutTimestamp(false); - RTPHeader header; if (!rtp_header_parser_->Parse(received_packet, length, &header)) { WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVoice, _channelId, "Incoming packet: invalid RTP header"); return -1; } - header.payload_type_frequency = - rtp_payload_registry_->GetPayloadTypeFrequency(header.payloadType); - if (header.payload_type_frequency < 0) - return -1; - bool in_order = IsPacketInOrder(header); - rtp_receive_statistics_->IncomingPacket( - header, length, IsPacketRetransmitted(header, in_order)); - rtp_payload_registry_->SetIncomingPayloadType(header); + return OnRtpPacketWithHeader(received_packet, length, &header) ? 0 : -1; +} - return ReceivePacket(received_packet, length, header, in_order) ? 0 : -1; +void Channel::OnRtpPacket(const RtpPacketReceived& packet) { + WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), + "Channel::ReceivedRTPPacket()"); + + RTPHeader header; + packet.GetHeader(&header); + OnRtpPacketWithHeader(packet.data(), packet.size(), &header); } bool Channel::ReceivePacket(const uint8_t* packet, diff --git a/webrtc/voice_engine/channel.h b/webrtc/voice_engine/channel.h index 03b19cc3a2..2be86be5aa 100644 --- a/webrtc/voice_engine/channel.h +++ b/webrtc/voice_engine/channel.h @@ -53,6 +53,7 @@ class RtcEventLog; class RTPPayloadRegistry; class RtpReceiver; class RTPReceiverAudio; +class RtpPacketReceived; class RtpRtcp; class TelephoneEventHandler; class VoERTPObserver; @@ -204,7 +205,9 @@ class Channel int32_t ReceivedRTPPacket(const uint8_t* received_packet, size_t length, const PacketTime& packet_time); + // TODO(nisse, solenberg): Delete when VoENetwork is deleted. int32_t ReceivedRTCPPacket(const uint8_t* data, size_t length); + void OnRtpPacket(const RtpPacketReceived& packet); // VoEFile int StartPlayingFileLocally(const char* fileName, @@ -391,6 +394,9 @@ class Channel void OnIncomingFractionLoss(int fraction_lost); private: + bool OnRtpPacketWithHeader(const uint8_t* received_packet, + size_t length, + RTPHeader *header); bool ReceivePacket(const uint8_t* packet, size_t packet_length, const RTPHeader& header, diff --git a/webrtc/voice_engine/channel_proxy.cc b/webrtc/voice_engine/channel_proxy.cc index 4e690fb62f..7f68f5101a 100644 --- a/webrtc/voice_engine/channel_proxy.cc +++ b/webrtc/voice_engine/channel_proxy.cc @@ -188,11 +188,9 @@ void ChannelProxy::DeRegisterExternalTransport() { channel()->DeRegisterExternalTransport(); } -bool ChannelProxy::ReceivedRTPPacket(const uint8_t* packet, - size_t length, - const PacketTime& packet_time) { +void ChannelProxy::OnRtpPacket(const RtpPacketReceived& packet) { // May be called on either worker thread or network thread. - return channel()->ReceivedRTPPacket(packet, length, packet_time) == 0; + channel()->OnRtpPacket(packet); } bool ChannelProxy::ReceivedRTCPPacket(const uint8_t* packet, size_t length) { diff --git a/webrtc/voice_engine/channel_proxy.h b/webrtc/voice_engine/channel_proxy.h index b70dcc454d..aa7cef1e02 100644 --- a/webrtc/voice_engine/channel_proxy.h +++ b/webrtc/voice_engine/channel_proxy.h @@ -30,6 +30,7 @@ class RtcEventLog; class RtcpBandwidthObserver; class RtcpRttStats; class RtpPacketSender; +class RtpPacketReceived; class RtpReceiver; class RtpRtcp; class Transport; @@ -84,9 +85,7 @@ class ChannelProxy { virtual void SetInputMute(bool muted); virtual void RegisterExternalTransport(Transport* transport); virtual void DeRegisterExternalTransport(); - virtual bool ReceivedRTPPacket(const uint8_t* packet, - size_t length, - const PacketTime& packet_time); + virtual void OnRtpPacket(const RtpPacketReceived& packet); virtual bool ReceivedRTCPPacket(const uint8_t* packet, size_t length); virtual const rtc::scoped_refptr& GetAudioDecoderFactory() const;