diff --git a/modules/rtp_rtcp/include/rtp_rtcp_defines.h b/modules/rtp_rtcp/include/rtp_rtcp_defines.h index 8691fe7c0f..cbeb77f561 100644 --- a/modules/rtp_rtcp/include/rtp_rtcp_defines.h +++ b/modules/rtp_rtcp/include/rtp_rtcp_defines.h @@ -448,6 +448,10 @@ struct StreamDataCounters { } int64_t first_packet_time_ms; // Time when first packet is sent/received. + // The timestamp at which the last packet was received, i.e. the time of the + // local clock when it was received - not the RTP timestamp of that packet. + // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-lastpacketreceivedtimestamp + absl::optional last_packet_received_timestamp_ms; RtpPacketCounter transmitted; // Number of transmitted packets/bytes. RtpPacketCounter retransmitted; // Number of retransmitted packets/bytes. RtpPacketCounter fec; // Number of redundancy packets/bytes. diff --git a/modules/rtp_rtcp/source/receive_statistics_impl.cc b/modules/rtp_rtcp/source/receive_statistics_impl.cc index 066dc4b7b9..b696daacf6 100644 --- a/modules/rtp_rtcp/source/receive_statistics_impl.cc +++ b/modules/rtp_rtcp/source/receive_statistics_impl.cc @@ -108,6 +108,7 @@ StreamDataCounters StreamStatisticianImpl::UpdateCounters( int64_t now_ms = clock_->TimeInMilliseconds(); incoming_bitrate_.Update(packet.size(), now_ms); + receive_counters_.last_packet_received_timestamp_ms = now_ms; receive_counters_.transmitted.AddPacket(packet); int64_t sequence_number = diff --git a/modules/rtp_rtcp/source/receive_statistics_unittest.cc b/modules/rtp_rtcp/source/receive_statistics_unittest.cc index 1703ceef41..2c6dc3851a 100644 --- a/modules/rtp_rtcp/source/receive_statistics_unittest.cc +++ b/modules/rtp_rtcp/source/receive_statistics_unittest.cc @@ -605,6 +605,19 @@ TEST_F(ReceiveStatisticsTest, RtpCallbacks) { callback.Matches(5, kSsrc1, expected); } +TEST_F(ReceiveStatisticsTest, LastPacketReceivedTimestamp) { + RtpTestCallback callback; + receive_statistics_ = ReceiveStatistics::Create(&clock_, nullptr, &callback); + + clock_.AdvanceTimeMilliseconds(42); + receive_statistics_->OnRtpPacket(packet1_); + EXPECT_EQ(42, callback.stats_.last_packet_received_timestamp_ms); + + clock_.AdvanceTimeMilliseconds(3); + receive_statistics_->OnRtpPacket(packet1_); + EXPECT_EQ(45, callback.stats_.last_packet_received_timestamp_ms); +} + TEST_F(ReceiveStatisticsTest, RtpCallbacksFecFirst) { RtpTestCallback callback; receive_statistics_ = ReceiveStatistics::Create(&clock_, nullptr, &callback);