diff --git a/webrtc/video/call_tests.cc b/webrtc/video/call_tests.cc index b305246c18..7b78af3d0e 100644 --- a/webrtc/video/call_tests.cc +++ b/webrtc/video/call_tests.cc @@ -1557,4 +1557,52 @@ TEST_F(CallTest, ReceiverReferenceTimeReportDisabled) { TestXrReceiverReferenceTimeReport(false); } +TEST_F(CallTest, TestReceivedRtpPacketStats) { + static const size_t kNumRtpPacketsToSend = 5; + class ReceivedRtpStatsObserver : public test::RtpRtcpObserver { + public: + ReceivedRtpStatsObserver() + : test::RtpRtcpObserver(kDefaultTimeoutMs), + receive_stream_(NULL), + sent_rtp_(0) {} + + void SetReceiveStream(VideoReceiveStream* stream) { + receive_stream_ = stream; + } + + private: + virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { + if (sent_rtp_ >= kNumRtpPacketsToSend) { + VideoReceiveStream::Stats stats = receive_stream_->GetStats(); + if (kNumRtpPacketsToSend == stats.rtp_stats.packets) { + observation_complete_->Set(); + } + return DROP_PACKET; + } + ++sent_rtp_; + return SEND_PACKET; + } + + VideoReceiveStream* receive_stream_; + uint32_t sent_rtp_; + } observer; + + CreateCalls(Call::Config(observer.SendTransport()), + Call::Config(observer.ReceiveTransport())); + observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver()); + + CreateTestConfigs(); + CreateStreams(); + observer.SetReceiveStream(receive_stream_); + CreateFrameGenerator(); + StartSending(); + + EXPECT_EQ(kEventSignaled, observer.Wait()) + << "Timed out while verifying number of received RTP packets."; + + StopSending(); + observer.StopSending(); + DestroyStreams(); +} + } // namespace webrtc diff --git a/webrtc/video_engine/vie_receiver.cc b/webrtc/video_engine/vie_receiver.cc index c8d75084b5..c588d78583 100644 --- a/webrtc/video_engine/vie_receiver.cc +++ b/webrtc/video_engine/vie_receiver.cc @@ -238,12 +238,16 @@ int ViEReceiver::InsertRTPPacket(const uint8_t* rtp_packet, header.payload_type_frequency = kVideoPayloadTypeFrequency; bool in_order = IsPacketInOrder(header); - rtp_receive_statistics_->IncomingPacket( - header, rtp_packet_length, IsPacketRetransmitted(header, in_order)); rtp_payload_registry_->SetIncomingPayloadType(header); - return ReceivePacket(rtp_packet, rtp_packet_length, header, in_order) + int ret = ReceivePacket(rtp_packet, rtp_packet_length, header, in_order) ? 0 : -1; + // Update receive statistics after ReceivePacket. + // Receive statistics will be reset if the payload type changes (make sure + // that the first packet is included in the stats). + rtp_receive_statistics_->IncomingPacket( + header, rtp_packet_length, IsPacketRetransmitted(header, in_order)); + return ret; } bool ViEReceiver::ReceivePacket(const uint8_t* packet,