diff --git a/modules/rtp_rtcp/source/capture_clock_offset_updater.cc b/modules/rtp_rtcp/source/capture_clock_offset_updater.cc index a5b12cb422..ad935a94f0 100644 --- a/modules/rtp_rtcp/source/capture_clock_offset_updater.cc +++ b/modules/rtp_rtcp/source/capture_clock_offset_updater.cc @@ -10,6 +10,8 @@ #include "modules/rtp_rtcp/source/capture_clock_offset_updater.h" +#include "system_wrappers/include/ntp_time.h" + namespace webrtc { absl::optional @@ -25,6 +27,14 @@ CaptureClockOffsetUpdater::AdjustEstimatedCaptureClockOffset( static_cast(*remote_to_local_clock_offset_); } +absl::optional CaptureClockOffsetUpdater::ConvertsToTimeDela( + absl::optional q32x32) { + if (q32x32 == absl::nullopt) { + return absl::nullopt; + } + return TimeDelta::Millis(Q32x32ToInt64Ms(*q32x32)); +} + void CaptureClockOffsetUpdater::SetRemoteToLocalClockOffset( absl::optional offset_q32x32) { remote_to_local_clock_offset_ = offset_q32x32; diff --git a/modules/rtp_rtcp/source/capture_clock_offset_updater.h b/modules/rtp_rtcp/source/capture_clock_offset_updater.h index 71d3eb4831..9b28848169 100644 --- a/modules/rtp_rtcp/source/capture_clock_offset_updater.h +++ b/modules/rtp_rtcp/source/capture_clock_offset_updater.h @@ -14,6 +14,7 @@ #include #include "absl/types/optional.h" +#include "api/units/time_delta.h" namespace webrtc { @@ -42,6 +43,10 @@ class CaptureClockOffsetUpdater { // Note that the value must be in Q32.32-formatted fixed-point seconds. void SetRemoteToLocalClockOffset(absl::optional offset_q32x32); + // Converts a signed Q32.32-formatted fixed-point to a TimeDelta. + static absl::optional ConvertsToTimeDela( + absl::optional q32x32); + private: absl::optional remote_to_local_clock_offset_; }; diff --git a/modules/rtp_rtcp/source/capture_clock_offset_updater_unittest.cc b/modules/rtp_rtcp/source/capture_clock_offset_updater_unittest.cc index 43e1dd1379..f6bea4ba96 100644 --- a/modules/rtp_rtcp/source/capture_clock_offset_updater_unittest.cc +++ b/modules/rtp_rtcp/source/capture_clock_offset_updater_unittest.cc @@ -55,4 +55,25 @@ TEST(AbsoluteCaptureTimeReceiverTest, EstimatedCaptureClockOffsetArithmetic) { *kRemoteToLocalClockOffset))); } +TEST(AbsoluteCaptureTimeReceiverTest, ConvertClockOffset) { + constexpr TimeDelta kNegative = TimeDelta::Millis(-350); + constexpr int64_t kNegativeQ32x32 = + kNegative.ms() * (NtpTime::kFractionsPerSecond / 1000); + constexpr TimeDelta kPositive = TimeDelta::Millis(400); + constexpr int64_t kPositiveQ32x32 = + kPositive.ms() * (NtpTime::kFractionsPerSecond / 1000); + constexpr TimeDelta kEpsilon = TimeDelta::Millis(1); + absl::optional converted = + CaptureClockOffsetUpdater::ConvertsToTimeDela(kNegativeQ32x32); + EXPECT_GT(converted, kNegative - kEpsilon); + EXPECT_LT(converted, kNegative + kEpsilon); + + converted = CaptureClockOffsetUpdater::ConvertsToTimeDela(kPositiveQ32x32); + EXPECT_GT(converted, kPositive - kEpsilon); + EXPECT_LT(converted, kPositive + kEpsilon); + + EXPECT_FALSE( + CaptureClockOffsetUpdater::ConvertsToTimeDela(absl::nullopt).has_value()); +} + } // namespace webrtc