Use monotonic clock to derive NTP timestamps in RTCP module
Use helper TimeMicrosToNtp() on clock TimeInMicroseconds() instead of CurrentNtpTime() and CurrentNtpTimeMillis() Also update TimeMicrosToNtp() to not introduce fractional in milliseconds offset. Expose that offset in time_utils.h Add test showing indended behavior. Bug: webrtc:9919 Change-Id: I8b019e11ae5b79d0b8ba113a84066b0369cd2575 Reviewed-on: https://webrtc-review.googlesource.com/c/107889 Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25391}
This commit is contained in:
committed by
Commit Bot
parent
fdee701fa8
commit
88c2c50dbd
@ -11,11 +11,13 @@
|
||||
#include <memory>
|
||||
|
||||
#include "common_types.h" // NOLINT(build/include)
|
||||
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
||||
#include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
|
||||
#include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
|
||||
#include "modules/rtp_rtcp/source/rtcp_sender.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_rtcp_impl.h"
|
||||
#include "modules/rtp_rtcp/source/time_util.h"
|
||||
#include "rtc_base/rate_limiter.h"
|
||||
#include "test/gmock.h"
|
||||
#include "test/gtest.h"
|
||||
@ -142,7 +144,7 @@ TEST_F(RtcpSenderTest, SendSr) {
|
||||
rtcp_sender_->SetSendingStatus(feedback_state, true);
|
||||
feedback_state.packets_sent = kPacketCount;
|
||||
feedback_state.media_bytes_sent = kOctetCount;
|
||||
NtpTime ntp = clock_.CurrentNtpTime();
|
||||
NtpTime ntp = TimeMicrosToNtp(clock_.TimeInMicroseconds());
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr));
|
||||
EXPECT_EQ(1, parser()->sender_report()->num_packets());
|
||||
EXPECT_EQ(kSenderSsrc, parser()->sender_report()->sender_ssrc());
|
||||
@ -154,6 +156,39 @@ TEST_F(RtcpSenderTest, SendSr) {
|
||||
EXPECT_EQ(0U, parser()->sender_report()->report_blocks().size());
|
||||
}
|
||||
|
||||
TEST_F(RtcpSenderTest, SendConsecutiveSrWithExactSlope) {
|
||||
const uint32_t kPacketCount = 0x12345;
|
||||
const uint32_t kOctetCount = 0x23456;
|
||||
const int kTimeBetweenSRsUs = 10043; // Not exact value in milliseconds.
|
||||
const int kExtraPackets = 30;
|
||||
// Make sure clock is not exactly at some milliseconds point.
|
||||
clock_.AdvanceTimeMicroseconds(kTimeBetweenSRsUs);
|
||||
rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
|
||||
RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
|
||||
rtcp_sender_->SetSendingStatus(feedback_state, true);
|
||||
feedback_state.packets_sent = kPacketCount;
|
||||
feedback_state.media_bytes_sent = kOctetCount;
|
||||
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr));
|
||||
EXPECT_EQ(1, parser()->sender_report()->num_packets());
|
||||
NtpTime ntp1 = parser()->sender_report()->ntp();
|
||||
uint32_t rtp1 = parser()->sender_report()->rtp_timestamp();
|
||||
|
||||
// Send more SRs to ensure slope is always exact for different offsets
|
||||
for (int packets = 1; packets <= kExtraPackets; ++packets) {
|
||||
clock_.AdvanceTimeMicroseconds(kTimeBetweenSRsUs);
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr));
|
||||
EXPECT_EQ(packets + 1, parser()->sender_report()->num_packets());
|
||||
|
||||
NtpTime ntp2 = parser()->sender_report()->ntp();
|
||||
uint32_t rtp2 = parser()->sender_report()->rtp_timestamp();
|
||||
|
||||
uint32_t ntp_diff_in_rtp_units =
|
||||
(ntp2.ToMs() - ntp1.ToMs()) * (kVideoPayloadTypeFrequency / 1000);
|
||||
EXPECT_EQ(rtp2 - rtp1, ntp_diff_in_rtp_units);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(RtcpSenderTest, DoNotSendSrBeforeRtp) {
|
||||
rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
|
||||
nullptr, nullptr, &test_transport_,
|
||||
@ -448,7 +483,7 @@ TEST_F(RtcpSenderTest, SendXrWithRrtr) {
|
||||
rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
|
||||
EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state(), false));
|
||||
rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
|
||||
NtpTime ntp = clock_.CurrentNtpTime();
|
||||
NtpTime ntp = TimeMicrosToNtp(clock_.TimeInMicroseconds());
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
|
||||
EXPECT_EQ(1, parser()->xr()->num_packets());
|
||||
EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
|
||||
|
||||
Reference in New Issue
Block a user