Calculate RTT using ExtendedReports in RtcpTransceiver
Bug: webrtc:8239 Change-Id: Iec3d21d6297c53388bbae88611e147fe91027c83 Reviewed-on: https://webrtc-review.googlesource.com/22800 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20953}
This commit is contained in:
committed by
Commit Bot
parent
5b86f0a24b
commit
319a675318
@ -13,6 +13,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "modules/rtp_rtcp/include/receive_statistics.h"
|
||||
#include "modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h"
|
||||
#include "modules/rtp_rtcp/source/time_util.h"
|
||||
#include "rtc_base/event.h"
|
||||
#include "rtc_base/fakeclock.h"
|
||||
@ -32,10 +33,13 @@ using ::testing::Return;
|
||||
using ::testing::SizeIs;
|
||||
using ::webrtc::CompactNtp;
|
||||
using ::webrtc::CompactNtpRttToMs;
|
||||
using ::webrtc::MockRtcpRttStats;
|
||||
using ::webrtc::MockTransport;
|
||||
using ::webrtc::NtpTime;
|
||||
using ::webrtc::RtcpTransceiverConfig;
|
||||
using ::webrtc::RtcpTransceiverImpl;
|
||||
using ::webrtc::SaturatedUsToCompactNtp;
|
||||
using ::webrtc::TimeMicrosToNtp;
|
||||
using ::webrtc::rtcp::ReportBlock;
|
||||
using ::webrtc::rtcp::SenderReport;
|
||||
using ::webrtc::test::RtcpPacketParser;
|
||||
@ -580,4 +584,92 @@ TEST(RtcpTransceiverImplTest, KeyFrameRequestCreatesReducedSizePacket) {
|
||||
EXPECT_EQ(rtcp_parser.receiver_report()->num_packets(), 0);
|
||||
}
|
||||
|
||||
TEST(RtcpTransceiverImplTest, SendsXrRrtrWhenEnabled) {
|
||||
const uint32_t kSenderSsrc = 4321;
|
||||
rtc::ScopedFakeClock clock;
|
||||
RtcpTransceiverConfig config;
|
||||
config.feedback_ssrc = kSenderSsrc;
|
||||
config.schedule_periodic_compound_packets = false;
|
||||
RtcpPacketParser rtcp_parser;
|
||||
RtcpParserTransport transport(&rtcp_parser);
|
||||
config.outgoing_transport = &transport;
|
||||
config.non_sender_rtt_measurement = true;
|
||||
RtcpTransceiverImpl rtcp_transceiver(config);
|
||||
|
||||
rtcp_transceiver.SendCompoundPacket();
|
||||
NtpTime ntp_time_now = TimeMicrosToNtp(rtc::TimeMicros());
|
||||
|
||||
EXPECT_EQ(rtcp_parser.xr()->num_packets(), 1);
|
||||
EXPECT_EQ(rtcp_parser.xr()->sender_ssrc(), kSenderSsrc);
|
||||
ASSERT_TRUE(rtcp_parser.xr()->rrtr());
|
||||
EXPECT_EQ(rtcp_parser.xr()->rrtr()->ntp(), ntp_time_now);
|
||||
}
|
||||
|
||||
TEST(RtcpTransceiverImplTest, SendsNoXrRrtrWhenDisabled) {
|
||||
RtcpTransceiverConfig config;
|
||||
config.schedule_periodic_compound_packets = false;
|
||||
RtcpPacketParser rtcp_parser;
|
||||
RtcpParserTransport transport(&rtcp_parser);
|
||||
config.outgoing_transport = &transport;
|
||||
config.non_sender_rtt_measurement = false;
|
||||
RtcpTransceiverImpl rtcp_transceiver(config);
|
||||
|
||||
rtcp_transceiver.SendCompoundPacket();
|
||||
|
||||
EXPECT_EQ(transport.num_packets(), 1);
|
||||
// Extended reports rtcp packet might be included for another reason,
|
||||
// but it shouldn't contain rrtr block.
|
||||
EXPECT_FALSE(rtcp_parser.xr()->rrtr());
|
||||
}
|
||||
|
||||
TEST(RtcpTransceiverImplTest, CalculatesRoundTripTimeOnDlrr) {
|
||||
const uint32_t kSenderSsrc = 4321;
|
||||
MockRtcpRttStats rtt_observer;
|
||||
MockTransport null_transport;
|
||||
RtcpTransceiverConfig config;
|
||||
config.feedback_ssrc = kSenderSsrc;
|
||||
config.schedule_periodic_compound_packets = false;
|
||||
config.outgoing_transport = &null_transport;
|
||||
config.non_sender_rtt_measurement = true;
|
||||
config.rtt_observer = &rtt_observer;
|
||||
RtcpTransceiverImpl rtcp_transceiver(config);
|
||||
|
||||
int64_t time_us = 12345678;
|
||||
webrtc::rtcp::ReceiveTimeInfo rti;
|
||||
rti.ssrc = kSenderSsrc;
|
||||
rti.last_rr = CompactNtp(TimeMicrosToNtp(time_us));
|
||||
rti.delay_since_last_rr = SaturatedUsToCompactNtp(10 * 1000);
|
||||
webrtc::rtcp::ExtendedReports xr;
|
||||
xr.AddDlrrItem(rti);
|
||||
auto raw_packet = xr.Build();
|
||||
|
||||
EXPECT_CALL(rtt_observer, OnRttUpdate(100 /* rtt_ms */));
|
||||
rtcp_transceiver.ReceivePacket(raw_packet, time_us + 110 * 1000);
|
||||
}
|
||||
|
||||
TEST(RtcpTransceiverImplTest, IgnoresUnknownSsrcInDlrr) {
|
||||
const uint32_t kSenderSsrc = 4321;
|
||||
const uint32_t kUnknownSsrc = 4322;
|
||||
MockRtcpRttStats rtt_observer;
|
||||
MockTransport null_transport;
|
||||
RtcpTransceiverConfig config;
|
||||
config.feedback_ssrc = kSenderSsrc;
|
||||
config.schedule_periodic_compound_packets = false;
|
||||
config.outgoing_transport = &null_transport;
|
||||
config.non_sender_rtt_measurement = true;
|
||||
config.rtt_observer = &rtt_observer;
|
||||
RtcpTransceiverImpl rtcp_transceiver(config);
|
||||
|
||||
int64_t time_us = 12345678;
|
||||
webrtc::rtcp::ReceiveTimeInfo rti;
|
||||
rti.ssrc = kUnknownSsrc;
|
||||
rti.last_rr = CompactNtp(TimeMicrosToNtp(time_us));
|
||||
webrtc::rtcp::ExtendedReports xr;
|
||||
xr.AddDlrrItem(rti);
|
||||
auto raw_packet = xr.Build();
|
||||
|
||||
EXPECT_CALL(rtt_observer, OnRttUpdate(_)).Times(0);
|
||||
rtcp_transceiver.ReceivePacket(raw_packet, time_us + 100000);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user