Function that Converts NtpTime to a Timestamp with UTC epoch in Clock.
danilchap@webrtc.org suggested to add a converter for NtpTime <-> UTC Timestamp for in https://webrtc-review.googlesource.com/c/src/+/365641. This CL add a NtpTime -> UTC Timestamp in Clock, and change code to start to use the new function. Bug: None Change-Id: If4af6cb8e31c1731692edfb8358e67b7a43226a0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/366001 Commit-Queue: Olov Brändström <brandstrom@google.com> Reviewed-by: Henrik Boström <hbos@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Henrik Andreassson <henrika@webrtc.org> Cr-Commit-Position: refs/heads/main@{#43293}
This commit is contained in:
parent
1c262bf5a4
commit
05666b4db7
@ -874,11 +874,9 @@ CallReceiveStatistics ChannelReceive::GetRTCPStatistics() const {
|
|||||||
if (rtcp_sr_stats.has_value()) {
|
if (rtcp_sr_stats.has_value()) {
|
||||||
stats.last_sender_report_timestamp = rtcp_sr_stats->last_arrival_timestamp;
|
stats.last_sender_report_timestamp = rtcp_sr_stats->last_arrival_timestamp;
|
||||||
stats.last_sender_report_utc_timestamp =
|
stats.last_sender_report_utc_timestamp =
|
||||||
Timestamp::Millis(rtcp_sr_stats->last_arrival_ntp_timestamp.ToMs() -
|
Clock::NtpToUtc(rtcp_sr_stats->last_arrival_ntp_timestamp);
|
||||||
rtc::kNtpJan1970Millisecs);
|
|
||||||
stats.last_sender_report_remote_utc_timestamp =
|
stats.last_sender_report_remote_utc_timestamp =
|
||||||
Timestamp::Millis(rtcp_sr_stats->last_remote_ntp_timestamp.ToMs() -
|
Clock::NtpToUtc(rtcp_sr_stats->last_remote_ntp_timestamp);
|
||||||
rtc::kNtpJan1970Millisecs);
|
|
||||||
stats.sender_reports_packets_sent = rtcp_sr_stats->packets_sent;
|
stats.sender_reports_packets_sent = rtcp_sr_stats->packets_sent;
|
||||||
stats.sender_reports_bytes_sent = rtcp_sr_stats->bytes_sent;
|
stats.sender_reports_bytes_sent = rtcp_sr_stats->bytes_sent;
|
||||||
stats.sender_reports_reports_count = rtcp_sr_stats->reports_count;
|
stats.sender_reports_reports_count = rtcp_sr_stats->reports_count;
|
||||||
|
|||||||
@ -621,9 +621,8 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block,
|
|||||||
NtpTime now_ntp = env_.clock().ConvertTimestampToNtpTime(now);
|
NtpTime now_ntp = env_.clock().ConvertTimestampToNtpTime(now);
|
||||||
// Number of seconds since 1900 January 1 00:00 GMT (see
|
// Number of seconds since 1900 January 1 00:00 GMT (see
|
||||||
// https://tools.ietf.org/html/rfc868).
|
// https://tools.ietf.org/html/rfc868).
|
||||||
report_block_data->SetReportBlock(
|
report_block_data->SetReportBlock(remote_ssrc, report_block,
|
||||||
remote_ssrc, report_block,
|
Clock::NtpToUtc(now_ntp), now);
|
||||||
Timestamp::Millis(now_ntp.ToMs() - rtc::kNtpJan1970Millisecs), now);
|
|
||||||
|
|
||||||
uint32_t send_time_ntp = report_block.last_sr();
|
uint32_t send_time_ntp = report_block.last_sr();
|
||||||
// RFC3550, section 6.4.1, LSR field discription states:
|
// RFC3550, section 6.4.1, LSR field discription states:
|
||||||
|
|||||||
@ -1544,8 +1544,7 @@ TEST(RtcpReceiverTest,
|
|||||||
const uint32_t kCumulativeLoss = 7;
|
const uint32_t kCumulativeLoss = 7;
|
||||||
const uint32_t kJitter = 9;
|
const uint32_t kJitter = 9;
|
||||||
const uint16_t kSequenceNumber = 1234;
|
const uint16_t kSequenceNumber = 1234;
|
||||||
const int64_t kNtpNowMs =
|
const Timestamp kUtcNow = Clock::NtpToUtc(mocks.clock.CurrentNtpTime());
|
||||||
mocks.clock.CurrentNtpInMilliseconds() - rtc::kNtpJan1970Millisecs;
|
|
||||||
|
|
||||||
rtcp::ReportBlock rtcp_block;
|
rtcp::ReportBlock rtcp_block;
|
||||||
rtcp_block.SetMediaSsrc(kReceiverMainSsrc);
|
rtcp_block.SetMediaSsrc(kReceiverMainSsrc);
|
||||||
@ -1566,8 +1565,7 @@ TEST(RtcpReceiverTest,
|
|||||||
EXPECT_EQ(rtcp_block.extended_high_seq_num(),
|
EXPECT_EQ(rtcp_block.extended_high_seq_num(),
|
||||||
report_block.extended_highest_sequence_number());
|
report_block.extended_highest_sequence_number());
|
||||||
EXPECT_EQ(rtcp_block.jitter(), report_block.jitter());
|
EXPECT_EQ(rtcp_block.jitter(), report_block.jitter());
|
||||||
EXPECT_EQ(report_block.report_block_timestamp_utc(),
|
EXPECT_EQ(report_block.report_block_timestamp_utc(), kUtcNow);
|
||||||
Timestamp::Millis(kNtpNowMs));
|
|
||||||
// No RTT is calculated in this test.
|
// No RTT is calculated in this test.
|
||||||
EXPECT_EQ(0u, report_block.num_rtts());
|
EXPECT_EQ(0u, report_block.num_rtts());
|
||||||
});
|
});
|
||||||
|
|||||||
@ -362,8 +362,7 @@ void RtcpTransceiverImpl::HandleReportBlocks(
|
|||||||
}
|
}
|
||||||
NtpTime now_ntp = config_.clock->ConvertTimestampToNtpTime(now);
|
NtpTime now_ntp = config_.clock->ConvertTimestampToNtpTime(now);
|
||||||
uint32_t receive_time_ntp = CompactNtp(now_ntp);
|
uint32_t receive_time_ntp = CompactNtp(now_ntp);
|
||||||
Timestamp now_utc =
|
Timestamp now_utc = Clock::NtpToUtc(now_ntp);
|
||||||
Timestamp::Millis(now_ntp.ToMs() - rtc::kNtpJan1970Millisecs);
|
|
||||||
|
|
||||||
for (const rtcp::ReportBlock& block : rtcp_report_blocks) {
|
for (const rtcp::ReportBlock& block : rtcp_report_blocks) {
|
||||||
std::optional<TimeDelta> rtt;
|
std::optional<TimeDelta> rtt;
|
||||||
|
|||||||
@ -142,6 +142,7 @@ if (rtc_include_tests && !build_with_chromium) {
|
|||||||
":field_trial",
|
":field_trial",
|
||||||
":metrics",
|
":metrics",
|
||||||
":system_wrappers",
|
":system_wrappers",
|
||||||
|
"../api/units:time_delta",
|
||||||
"../rtc_base:checks",
|
"../rtc_base:checks",
|
||||||
"../rtc_base:random",
|
"../rtc_base:random",
|
||||||
"../rtc_base:stringutils",
|
"../rtc_base:stringutils",
|
||||||
|
|||||||
@ -48,6 +48,23 @@ class RTC_EXPORT Clock {
|
|||||||
return ConvertTimestampToNtpTime(Timestamp::Millis(timestamp_ms)).ToMs();
|
return ConvertTimestampToNtpTime(Timestamp::Millis(timestamp_ms)).ToMs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts NtpTime to a Timestamp with UTC epoch.
|
||||||
|
// A `Minus Infinity` Timestamp is returned if the NtpTime is invalid.
|
||||||
|
static Timestamp NtpToUtc(NtpTime ntp_time) {
|
||||||
|
if (!ntp_time.Valid()) {
|
||||||
|
return Timestamp::MinusInfinity();
|
||||||
|
}
|
||||||
|
// Seconds since UTC epoch.
|
||||||
|
int64_t time = ntp_time.seconds() - kNtpJan1970;
|
||||||
|
// Microseconds since UTC epoch (not including NTP fraction)
|
||||||
|
time = time * 1'000'000;
|
||||||
|
// Fractions part of the NTP time, in microseconds.
|
||||||
|
int64_t time_fraction =
|
||||||
|
DivideRoundToNearest(int64_t{ntp_time.fractions()} * 1'000'000,
|
||||||
|
NtpTime::kFractionsPerSecond);
|
||||||
|
return Timestamp::Micros(time + time_fraction);
|
||||||
|
}
|
||||||
|
|
||||||
// Returns an instance of the real-time system clock implementation.
|
// Returns an instance of the real-time system clock implementation.
|
||||||
static Clock* GetRealTimeClock();
|
static Clock* GetRealTimeClock();
|
||||||
};
|
};
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include "system_wrappers/include/clock.h"
|
#include "system_wrappers/include/clock.h"
|
||||||
|
|
||||||
|
#include "api/units/time_delta.h"
|
||||||
#include "test/gtest.h"
|
#include "test/gtest.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
@ -31,4 +32,13 @@ TEST(ClockTest, NtpTime) {
|
|||||||
EXPECT_GE(milliseconds_upper_bound + 1, ntp_time.ToMs());
|
EXPECT_GE(milliseconds_upper_bound + 1, ntp_time.ToMs());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ClockTest, NtpToUtc) {
|
||||||
|
Clock* clock = Clock::GetRealTimeClock();
|
||||||
|
NtpTime ntp = clock->CurrentNtpTime();
|
||||||
|
Timestamp a = Clock::NtpToUtc(ntp);
|
||||||
|
Timestamp b = Timestamp::Millis(ntp.ToMs() - int64_t{kNtpJan1970} * 1000);
|
||||||
|
TimeDelta d = a - b;
|
||||||
|
EXPECT_LT(d.Abs(), TimeDelta::Millis(1));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@ -573,11 +573,9 @@ VideoReceiveStreamInterface::Stats VideoReceiveStream2::GetStats() const {
|
|||||||
rtp_video_stream_receiver_.GetSenderReportStats();
|
rtp_video_stream_receiver_.GetSenderReportStats();
|
||||||
if (rtcp_sr_stats) {
|
if (rtcp_sr_stats) {
|
||||||
stats.last_sender_report_utc_timestamp =
|
stats.last_sender_report_utc_timestamp =
|
||||||
Timestamp::Millis(rtcp_sr_stats->last_arrival_ntp_timestamp.ToMs() -
|
Clock::NtpToUtc(rtcp_sr_stats->last_arrival_ntp_timestamp);
|
||||||
rtc::kNtpJan1970Millisecs);
|
|
||||||
stats.last_sender_report_remote_utc_timestamp =
|
stats.last_sender_report_remote_utc_timestamp =
|
||||||
Timestamp::Millis(rtcp_sr_stats->last_remote_ntp_timestamp.ToMs() -
|
Clock::NtpToUtc(rtcp_sr_stats->last_remote_ntp_timestamp);
|
||||||
rtc::kNtpJan1970Millisecs);
|
|
||||||
stats.sender_reports_packets_sent = rtcp_sr_stats->packets_sent;
|
stats.sender_reports_packets_sent = rtcp_sr_stats->packets_sent;
|
||||||
stats.sender_reports_bytes_sent = rtcp_sr_stats->bytes_sent;
|
stats.sender_reports_bytes_sent = rtcp_sr_stats->bytes_sent;
|
||||||
stats.sender_reports_reports_count = rtcp_sr_stats->reports_count;
|
stats.sender_reports_reports_count = rtcp_sr_stats->reports_count;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user