Add Timestamp -> AbsoluteSendTime conversion function
instead of ms -> AbsoluteSendTime helper
Bug: webrtc:13757
Change-Id: I57389a66a43b4f4838023f9c224a985f2cd57107
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/266024
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37350}
diff --git a/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc b/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
index 02d428f..c2360c0 100644
--- a/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
+++ b/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
@@ -584,11 +584,11 @@
first_send_timestamp = packet.sent_packet.send_time;
}));
// Incoming packet with abs sendtime but without transport sequence number.
- proxy_.IncomingPacket({.arrival_time = kBaseTime,
- .size = kDefaultPacketSize,
- .ssrc = kMediaSsrc,
- .absolute_send_time_24bits =
- AbsoluteSendTime::MsTo24Bits(kBaseTime.ms())});
+ proxy_.IncomingPacket(
+ {.arrival_time = kBaseTime,
+ .size = kDefaultPacketSize,
+ .ssrc = kMediaSsrc,
+ .absolute_send_time_24bits = AbsoluteSendTime::To24Bits(kBaseTime)});
// Expect packet with older abs send time to be treated as sent at the same
// time as the previous packet due to reordering.
@@ -603,15 +603,16 @@
.size = kDefaultPacketSize,
.ssrc = kMediaSsrc,
.absolute_send_time_24bits =
- AbsoluteSendTime::MsTo24Bits(kBaseTime.ms() - 12)});
+ AbsoluteSendTime::To24Bits(kBaseTime - TimeDelta::Millis(12))});
}
TEST_F(RemoteEstimatorProxyTest, IncomingPacketHandlesWrapInAbsSendTime) {
// abs send time use 24bit precision.
const uint32_t kFirstAbsSendTime =
- AbsoluteSendTime::MsTo24Bits((1 << 24) - 30);
+ AbsoluteSendTime::To24Bits(Timestamp::Millis((1 << 24) - 30));
// Second abs send time has wrapped.
- const uint32_t kSecondAbsSendTime = AbsoluteSendTime::MsTo24Bits((1 << 24));
+ const uint32_t kSecondAbsSendTime =
+ AbsoluteSendTime::To24Bits(Timestamp::Millis(1 << 24));
const TimeDelta kExpectedAbsSendTimeDelta = TimeDelta::Millis(30);
Timestamp first_send_timestamp = Timestamp::Millis(0);
@@ -641,12 +642,13 @@
}
TEST_F(RemoteEstimatorProxyTest, SendTransportFeedbackAndNetworkStateUpdate) {
- proxy_.IncomingPacket({.arrival_time = kBaseTime,
- .size = kDefaultPacketSize,
- .ssrc = kMediaSsrc,
- .absolute_send_time_24bits =
- AbsoluteSendTime::MsTo24Bits(kBaseTime.ms() - 1),
- .transport_sequence_number = kBaseSeq});
+ proxy_.IncomingPacket(
+ {.arrival_time = kBaseTime,
+ .size = kDefaultPacketSize,
+ .ssrc = kMediaSsrc,
+ .absolute_send_time_24bits =
+ AbsoluteSendTime::To24Bits(kBaseTime - TimeDelta::Millis(1)),
+ .transport_sequence_number = kBaseSeq});
EXPECT_CALL(network_state_estimator_, GetCurrentEstimate())
.WillOnce(Return(NetworkStateEstimate()));
EXPECT_CALL(feedback_sender_, Call(SizeIs(2)));
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index bab5bf9..300d68a 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -358,6 +358,7 @@
"../../api/rtc_event_log",
"../../api/transport:field_trial_based_config",
"../../api/units:data_rate",
+ "../../api/units:timestamp",
"../../api/video:video_bitrate_allocation",
"../../logging:rtc_event_rtp_rtcp",
"../../rtc_base:checks",
diff --git a/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc b/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc
index 35936c4..c6a9cfa 100644
--- a/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc
+++ b/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc
@@ -16,6 +16,7 @@
#include "absl/strings/match.h"
#include "api/transport/field_trial_based_config.h"
+#include "api/units/timestamp.h"
#include "logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.h"
#include "modules/remote_bitrate_estimator/test/bwe_test_logging.h"
#include "rtc_base/logging.h"
@@ -105,7 +106,8 @@
const uint32_t packet_ssrc = packet->Ssrc();
RTC_DCHECK(packet->packet_type().has_value());
RTC_DCHECK(HasCorrectSsrc(*packet));
- int64_t now_ms = clock_->TimeInMilliseconds();
+ Timestamp now = clock_->CurrentTime();
+ int64_t now_ms = now.ms();
if (is_audio_) {
#if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
@@ -160,15 +162,14 @@
packet->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * diff_ms);
}
if (packet->HasExtension<AbsoluteSendTime>()) {
- packet->SetExtension<AbsoluteSendTime>(
- AbsoluteSendTime::MsTo24Bits(now_ms));
+ packet->SetExtension<AbsoluteSendTime>(AbsoluteSendTime::To24Bits(now));
}
if (packet->HasExtension<VideoTimingExtension>()) {
if (populate_network2_timestamp_) {
- packet->set_network2_time(Timestamp::Millis(now_ms));
+ packet->set_network2_time(now);
} else {
- packet->set_pacer_exit_time(Timestamp::Millis(now_ms));
+ packet->set_pacer_exit_time(now);
}
}
@@ -200,7 +201,7 @@
// actual sending fails.
if (is_media && packet->allow_retransmission()) {
packet_history_->PutRtpPacket(std::make_unique<RtpPacketToSend>(*packet),
- Timestamp::Millis(now_ms));
+ now);
} else if (packet->retransmitted_sequence_number()) {
packet_history_->MarkPacketAsSent(*packet->retransmitted_sequence_number());
}
diff --git a/modules/rtp_rtcp/source/rtp_header_extensions.h b/modules/rtp_rtcp/source/rtp_header_extensions.h
index 0579417..62b1929 100644
--- a/modules/rtp_rtcp/source/rtp_header_extensions.h
+++ b/modules/rtp_rtcp/source/rtp_header_extensions.h
@@ -20,11 +20,13 @@
#include "api/array_view.h"
#include "api/rtp_headers.h"
#include "api/rtp_parameters.h"
+#include "api/units/timestamp.h"
#include "api/video/color_space.h"
#include "api/video/video_content_type.h"
#include "api/video/video_rotation.h"
#include "api/video/video_timing.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
+#include "rtc_base/numerics/divide_round.h"
namespace webrtc {
@@ -41,8 +43,12 @@
static size_t ValueSize(uint32_t time_24bits) { return kValueSizeBytes; }
static bool Write(rtc::ArrayView<uint8_t> data, uint32_t time_24bits);
- static constexpr uint32_t MsTo24Bits(int64_t time_ms) {
- return static_cast<uint32_t>(((time_ms << 18) + 500) / 1000) & 0x00FFFFFF;
+ static constexpr uint32_t To24Bits(Timestamp time) {
+ int64_t time_us = time.us() % (int64_t{1 << 6} * 1'000'000);
+ int64_t time6x18 = DivideRoundToNearest(time_us << 18, 1'000'000);
+ RTC_DCHECK_GE(time6x18, 0);
+ RTC_DCHECK_LT(time6x18, 1 << 24);
+ return static_cast<uint32_t>(time6x18);
}
};
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress.cc b/modules/rtp_rtcp/source/rtp_sender_egress.cc
index e0f68b4..a4957f7 100644
--- a/modules/rtp_rtcp/source/rtp_sender_egress.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_egress.cc
@@ -155,12 +155,12 @@
}
const uint32_t packet_ssrc = packet->Ssrc();
- const int64_t now_ms = clock_->TimeInMilliseconds();
+ const Timestamp now = clock_->CurrentTime();
#if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
worker_queue_->PostTask(
- ToQueuedTask(task_safety_, [this, now_ms, packet_ssrc]() {
- BweTestLoggingPlot(now_ms, packet_ssrc);
+ ToQueuedTask(task_safety_, [this, now, packet_ssrc]() {
+ BweTestLoggingPlot(now.ms(), packet_ssrc);
}));
#endif
@@ -225,20 +225,19 @@
// In case of VideoTimingExtension, since it's present not in every packet,
// data after rtp header may be corrupted if these packets are protected by
// the FEC.
- int64_t diff_ms = now_ms - packet->capture_time().ms();
+ TimeDelta diff = now - packet->capture_time();
if (packet->HasExtension<TransmissionOffset>()) {
- packet->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * diff_ms);
+ packet->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * diff.ms());
}
if (packet->HasExtension<AbsoluteSendTime>()) {
- packet->SetExtension<AbsoluteSendTime>(
- AbsoluteSendTime::MsTo24Bits(now_ms));
+ packet->SetExtension<AbsoluteSendTime>(AbsoluteSendTime::To24Bits(now));
}
if (packet->HasExtension<VideoTimingExtension>()) {
if (populate_network2_timestamp_) {
- packet->set_network2_time(Timestamp::Millis(now_ms));
+ packet->set_network2_time(now);
} else {
- packet->set_pacer_exit_time(Timestamp::Millis(now_ms));
+ packet->set_pacer_exit_time(now);
}
}
@@ -265,7 +264,7 @@
if (packet->packet_type() != RtpPacketMediaType::kPadding &&
packet->packet_type() != RtpPacketMediaType::kRetransmission) {
- UpdateDelayStatistics(packet->capture_time().ms(), now_ms, packet_ssrc);
+ UpdateDelayStatistics(packet->capture_time().ms(), now.ms(), packet_ssrc);
UpdateOnSendPacket(options.packet_id, packet->capture_time().ms(),
packet_ssrc);
}
@@ -276,7 +275,7 @@
// actual sending fails.
if (is_media && packet->allow_retransmission()) {
packet_history_->PutRtpPacket(std::make_unique<RtpPacketToSend>(*packet),
- Timestamp::Millis(now_ms));
+ now);
} else if (packet->retransmitted_sequence_number()) {
packet_history_->MarkPacketAsSent(*packet->retransmitted_sequence_number());
}
@@ -295,10 +294,10 @@
RtpPacketCounter counter(*packet);
size_t size = packet->size();
worker_queue_->PostTask(
- ToQueuedTask(task_safety_, [this, now_ms, packet_ssrc, packet_type,
+ ToQueuedTask(task_safety_, [this, now, packet_ssrc, packet_type,
counter = std::move(counter), size]() {
RTC_DCHECK_RUN_ON(worker_queue_);
- UpdateRtpStats(now_ms, packet_ssrc, packet_type, std::move(counter),
+ UpdateRtpStats(now.ms(), packet_ssrc, packet_type, std::move(counter),
size);
}));
}
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
index 33c06c4..ddeeb8b 100644
--- a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
@@ -754,7 +754,7 @@
EXPECT_EQ(received_packet.GetExtension<TransmissionOffset>(), kDiffMs * 90);
EXPECT_EQ(received_packet.GetExtension<AbsoluteSendTime>(),
- AbsoluteSendTime::MsTo24Bits(clock_->TimeInMilliseconds()));
+ AbsoluteSendTime::To24Bits(clock_->CurrentTime()));
VideoSendTiming timing;
EXPECT_TRUE(received_packet.GetExtension<VideoTimingExtension>(&timing));