From 3703b3500c6cdbf391de8ee1981df741088659c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20de=20Vicente=20Pe=C3=B1a?= Date: Fri, 26 Apr 2024 13:45:40 +0200 Subject: [PATCH] Using Ntp times for the absolute send time. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:15930 Change-Id: Ie460ac6e3561efafeb11bf36735cb6f33bdfd8a3 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/349162 Commit-Queue: Jesus de Vicente Pena Reviewed-by: Jakob Ivarsson‎ Reviewed-by: Danil Chapovalov Reviewed-by: Lionel Koenig Gélas Cr-Commit-Position: refs/heads/main@{#42183} --- audio/channel_send.cc | 1 + experiments/field_trials.py | 3 ++ .../rtp_rtcp/source/rtp_header_extensions.h | 6 ++++ modules/rtp_rtcp/source/rtp_sender_egress.cc | 34 ++++++++++++++----- modules/rtp_rtcp/source/rtp_sender_egress.h | 1 + 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/audio/channel_send.cc b/audio/channel_send.cc index 4a2700177b..e8eaa3111e 100644 --- a/audio/channel_send.cc +++ b/audio/channel_send.cc @@ -430,6 +430,7 @@ ChannelSend::ChannelSend( configuration.rtcp_packet_type_counter_observer = this; configuration.local_media_ssrc = ssrc; + configuration.field_trials = &field_trials; rtp_rtcp_ = ModuleRtpRtcpImpl2::Create(configuration); rtp_rtcp_->SetSendingMediaStatus(false); diff --git a/experiments/field_trials.py b/experiments/field_trials.py index 2ffcbeb89d..cc6a8cb1a4 100755 --- a/experiments/field_trials.py +++ b/experiments/field_trials.py @@ -123,6 +123,9 @@ ACTIVE_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ FieldTrial('WebRTC-TaskQueue-ReplaceLibeventWithStdlib', 'webrtc:14389', date(2024, 4, 1)), + FieldTrial('WebRTC-UseNtpTimeAbsoluteSendTime', + 'webrtc:15930', + date(2024, 9, 1)), FieldTrial('WebRTC-VP8-MaxFrameInterval', 'webrtc:15530', date(2024, 4, 1)), diff --git a/modules/rtp_rtcp/source/rtp_header_extensions.h b/modules/rtp_rtcp/source/rtp_header_extensions.h index 23a0aec558..02a1543e00 100644 --- a/modules/rtp_rtcp/source/rtp_header_extensions.h +++ b/modules/rtp_rtcp/source/rtp_header_extensions.h @@ -27,6 +27,7 @@ #include "api/video/video_rotation.h" #include "api/video/video_timing.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" +#include "system_wrappers/include/ntp_time.h" // This file contains class definitions for reading/writing each RTP header // extension. Each class must be defined such that it is compatible with being @@ -58,6 +59,11 @@ class AbsoluteSendTime { return static_cast(time6x18); } + static uint32_t To24Bits(NtpTime ntp_time) { + uint64_t ntp_time32x32 = static_cast(ntp_time); + return (ntp_time32x32 >> 14) & 0x00FF'FFFF; + } + static constexpr Timestamp ToTimestamp(uint32_t time_24bits) { RTC_DCHECK_LT(time_24bits, (1 << 24)); return Timestamp::Micros((time_24bits* int64_t{1'000'000}) >> 18); diff --git a/modules/rtp_rtcp/source/rtp_sender_egress.cc b/modules/rtp_rtcp/source/rtp_sender_egress.cc index 665c7ce47e..8292489896 100644 --- a/modules/rtp_rtcp/source/rtp_sender_egress.cc +++ b/modules/rtp_rtcp/source/rtp_sender_egress.cc @@ -26,6 +26,15 @@ constexpr uint32_t kTimestampTicksPerMs = 90; constexpr TimeDelta kBitrateStatisticsWindow = TimeDelta::Seconds(1); constexpr size_t kRtpSequenceNumberMapMaxEntries = 1 << 13; constexpr TimeDelta kUpdateInterval = kBitrateStatisticsWindow; + +bool GetUseNtpTimeForAbsoluteSendTime(const FieldTrialsView* field_trials) { + if (field_trials != nullptr && + field_trials->IsDisabled("WebRTC-UseNtpTimeAbsoluteSendTime")) { + return false; + } + return true; +} + } // namespace RtpSenderEgress::NonPacedPacketSender::NonPacedPacketSender( @@ -104,7 +113,9 @@ RtpSenderEgress::RtpSenderEgress(const RtpRtcpInterface::Configuration& config, rtp_sequence_number_map_(need_rtp_packet_infos_ ? std::make_unique( kRtpSequenceNumberMapMaxEntries) - : nullptr) { + : nullptr), + use_ntp_time_for_absolute_send_time_( + GetUseNtpTimeForAbsoluteSendTime(config.field_trials)) { RTC_DCHECK(worker_queue_); RTC_DCHECK(config.transport_feedback_callback == nullptr) << "transport_feedback_callback is no longer used and will soon be " @@ -209,7 +220,12 @@ void RtpSenderEgress::SendPacket(std::unique_ptr packet, packet->SetExtension(kTimestampTicksPerMs * diff.ms()); } if (packet->HasExtension()) { - packet->SetExtension(AbsoluteSendTime::To24Bits(now)); + if (use_ntp_time_for_absolute_send_time_) { + packet->SetExtension( + AbsoluteSendTime::To24Bits(clock_->ConvertTimestampToNtpTime(now))); + } else { + packet->SetExtension(AbsoluteSendTime::To24Bits(now)); + } } if (packet->HasExtension() && packet->transport_sequence_number()) { @@ -457,16 +473,16 @@ void RtpSenderEgress::UpdateRtpStats(Timestamp now, } else if (packet_type == RtpPacketMediaType::kRetransmission) { counters->retransmitted.Add(counter); } - counters->transmitted.Add(counter); + counters->transmitted.Add(counter); - send_rates_[static_cast(packet_type)].Update(packet_size, now); - if (bitrate_callback_) { + send_rates_[static_cast(packet_type)].Update(packet_size, now); + if (bitrate_callback_) { send_rates = GetSendRates(now); - } + } - if (rtp_stats_callback_) { - rtp_stats_callback_->DataCountersUpdated(*counters, packet_ssrc); - } + if (rtp_stats_callback_) { + rtp_stats_callback_->DataCountersUpdated(*counters, packet_ssrc); + } // The bitrate_callback_ and rtp_stats_callback_ pointers in practice point // to the same object, so these callbacks could be consolidated into one. diff --git a/modules/rtp_rtcp/source/rtp_sender_egress.h b/modules/rtp_rtcp/source/rtp_sender_egress.h index cb8a4dc3b0..692757cb9d 100644 --- a/modules/rtp_rtcp/source/rtp_sender_egress.h +++ b/modules/rtp_rtcp/source/rtp_sender_egress.h @@ -167,6 +167,7 @@ class RtpSenderEgress { RepeatingTaskHandle update_task_ RTC_GUARDED_BY(worker_queue_); std::vector packets_to_send_ RTC_GUARDED_BY(worker_queue_); ScopedTaskSafety task_safety_; + const bool use_ntp_time_for_absolute_send_time_; }; } // namespace webrtc