Surface local_capture_clock_offset from RtpSource

- Propagating `RtpPacketInfo::local_capture_clock_offset`, an
  existing field that is related to the abs-capture-timestamp
  header extension field `estimated_capture_clock_offset`
- Propagated through `SourceTracker::SourceEntry`

Bug: webrtc:10739, b/246753278
Change-Id: I21d9841e4f3a35da5f8d7b31582898309421d524
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/275241
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38129}
This commit is contained in:
Alessio Bazzica
2022-09-20 11:16:16 +02:00
committed by WebRTC LUCI CQ
parent 54d9f056c6
commit 56b96ffe6a
9 changed files with 123 additions and 40 deletions

View File

@ -22,6 +22,7 @@
#include "api/rtp_headers.h"
#include "api/rtp_packet_info.h"
#include "api/rtp_packet_infos.h"
#include "system_wrappers/include/ntp_time.h"
#include "test/gmock.h"
#include "test/gtest.h"
@ -47,8 +48,9 @@ class ExpectedSourceTracker {
const int64_t now_ms = clock_->TimeInMilliseconds();
for (const auto& packet_info : packet_infos) {
RtpSource::Extensions extensions = {packet_info.audio_level(),
packet_info.absolute_capture_time()};
RtpSource::Extensions extensions = {
packet_info.audio_level(), packet_info.absolute_capture_time(),
packet_info.local_capture_clock_offset()};
for (const auto& csrc : packet_info.csrcs()) {
entries_.emplace_front(now_ms, csrc, RtpSourceType::CSRC,
@ -112,7 +114,8 @@ class SourceTrackerRandomTest
.emplace_back(GenerateSsrc(), GenerateCsrcs(), GenerateRtpTimestamp(),
GenerateReceiveTime())
.set_audio_level(GenerateAudioLevel())
.set_absolute_capture_time(GenerateAbsoluteCaptureTime());
.set_absolute_capture_time(GenerateAbsoluteCaptureTime())
.set_local_capture_clock_offset(GenerateLocalCaptureClockOffset());
}
return RtpPacketInfos(std::move(packet_infos));
@ -193,6 +196,14 @@ class SourceTrackerRandomTest
return value;
}
absl::optional<TimeDelta> GenerateLocalCaptureClockOffset() {
if (std::bernoulli_distribution(0.5)(generator_)) {
return absl::nullopt;
}
return TimeDelta::Millis(
UQ32x32ToInt64Ms(std::uniform_int_distribution<int64_t>()(generator_)));
}
Timestamp GenerateReceiveTime() {
return Timestamp::Micros(
std::uniform_int_distribution<int64_t>()(generator_));
@ -254,6 +265,7 @@ TEST(SourceTrackerTest, OnFrameDeliveredRecordsSourcesDistinctSsrcs) {
constexpr absl::optional<AbsoluteCaptureTime> kAbsoluteCaptureTime =
AbsoluteCaptureTime{/*absolute_capture_timestamp=*/12,
/*estimated_capture_clock_offset=*/absl::nullopt};
constexpr absl::optional<TimeDelta> kLocalCaptureClockOffset = absl::nullopt;
constexpr Timestamp kReceiveTime0 = Timestamp::Millis(60);
constexpr Timestamp kReceiveTime1 = Timestamp::Millis(70);
@ -263,18 +275,22 @@ TEST(SourceTrackerTest, OnFrameDeliveredRecordsSourcesDistinctSsrcs) {
tracker.OnFrameDelivered(RtpPacketInfos(
{RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
.set_audio_level(kAudioLevel0)
.set_absolute_capture_time(kAbsoluteCaptureTime),
.set_absolute_capture_time(kAbsoluteCaptureTime)
.set_local_capture_clock_offset(kLocalCaptureClockOffset),
RtpPacketInfo(kSsrc2, {kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
.set_audio_level(kAudioLevel1)
.set_absolute_capture_time(kAbsoluteCaptureTime)}));
.set_absolute_capture_time(kAbsoluteCaptureTime)
.set_local_capture_clock_offset(kLocalCaptureClockOffset)}));
int64_t timestamp_ms = clock.TimeInMilliseconds();
constexpr RtpSource::Extensions extensions0 = {
.audio_level = kAudioLevel0,
.absolute_capture_time = kAbsoluteCaptureTime};
.absolute_capture_time = kAbsoluteCaptureTime,
.local_capture_clock_offset = kLocalCaptureClockOffset};
constexpr RtpSource::Extensions extensions1 = {
.audio_level = kAudioLevel1,
.absolute_capture_time = kAbsoluteCaptureTime};
.absolute_capture_time = kAbsoluteCaptureTime,
.local_capture_clock_offset = kLocalCaptureClockOffset};
EXPECT_THAT(tracker.GetSources(),
ElementsAre(RtpSource(timestamp_ms, kSsrc2, RtpSourceType::SSRC,
@ -303,6 +319,7 @@ TEST(SourceTrackerTest, OnFrameDeliveredRecordsSourcesSameSsrc) {
constexpr absl::optional<AbsoluteCaptureTime> kAbsoluteCaptureTime =
AbsoluteCaptureTime{/*absolute_capture_timestamp=*/12,
/*estimated_capture_clock_offset=*/absl::nullopt};
constexpr absl::optional<TimeDelta> kLocalCaptureClockOffset = absl::nullopt;
constexpr Timestamp kReceiveTime0 = Timestamp::Millis(60);
constexpr Timestamp kReceiveTime1 = Timestamp::Millis(70);
constexpr Timestamp kReceiveTime2 = Timestamp::Millis(80);
@ -313,22 +330,31 @@ TEST(SourceTrackerTest, OnFrameDeliveredRecordsSourcesSameSsrc) {
tracker.OnFrameDelivered(RtpPacketInfos({
RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
.set_audio_level(kAudioLevel0)
.set_absolute_capture_time(kAbsoluteCaptureTime),
.set_absolute_capture_time(kAbsoluteCaptureTime)
.set_local_capture_clock_offset(kLocalCaptureClockOffset),
RtpPacketInfo(kSsrc, {kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
.set_audio_level(kAudioLevel1)
.set_absolute_capture_time(kAbsoluteCaptureTime),
.set_absolute_capture_time(kAbsoluteCaptureTime)
.set_local_capture_clock_offset(kLocalCaptureClockOffset),
RtpPacketInfo(kSsrc, {kCsrcs0}, kRtpTimestamp2, kReceiveTime2)
.set_audio_level(kAudioLevel2)
.set_absolute_capture_time(kAbsoluteCaptureTime),
.set_absolute_capture_time(kAbsoluteCaptureTime)
.set_local_capture_clock_offset(kLocalCaptureClockOffset),
}));
int64_t timestamp_ms = clock.TimeInMilliseconds();
constexpr RtpSource::Extensions extensions0 = {kAudioLevel0,
kAbsoluteCaptureTime};
constexpr RtpSource::Extensions extensions1 = {kAudioLevel1,
kAbsoluteCaptureTime};
constexpr RtpSource::Extensions extensions2 = {kAudioLevel2,
kAbsoluteCaptureTime};
constexpr RtpSource::Extensions extensions0 = {
.audio_level = kAudioLevel0,
.absolute_capture_time = kAbsoluteCaptureTime,
.local_capture_clock_offset = kLocalCaptureClockOffset};
constexpr RtpSource::Extensions extensions1 = {
.audio_level = kAudioLevel1,
.absolute_capture_time = kAbsoluteCaptureTime,
.local_capture_clock_offset = kLocalCaptureClockOffset};
constexpr RtpSource::Extensions extensions2 = {
.audio_level = kAudioLevel2,
.absolute_capture_time = kAbsoluteCaptureTime,
.local_capture_clock_offset = kLocalCaptureClockOffset};
EXPECT_THAT(tracker.GetSources(),
ElementsAre(RtpSource(timestamp_ms, kSsrc, RtpSourceType::SSRC,
@ -359,19 +385,28 @@ TEST(SourceTrackerTest, OnFrameDeliveredUpdatesSources) {
AbsoluteCaptureTime{56, 78};
constexpr absl::optional<AbsoluteCaptureTime> kAbsoluteCaptureTime2 =
AbsoluteCaptureTime{89, 90};
constexpr absl::optional<TimeDelta> kLocalCaptureClockOffset0 =
TimeDelta::Millis(123);
constexpr absl::optional<TimeDelta> kLocalCaptureClockOffset1 =
TimeDelta::Millis(456);
constexpr absl::optional<TimeDelta> kLocalCaptureClockOffset2 =
TimeDelta::Millis(789);
constexpr Timestamp kReceiveTime0 = Timestamp::Millis(60);
constexpr Timestamp kReceiveTime1 = Timestamp::Millis(61);
constexpr Timestamp kReceiveTime2 = Timestamp::Millis(62);
constexpr RtpSource::Extensions extensions0 = {
.audio_level = kAudioLevel0,
.absolute_capture_time = kAbsoluteCaptureTime0};
.absolute_capture_time = kAbsoluteCaptureTime0,
.local_capture_clock_offset = kLocalCaptureClockOffset0};
constexpr RtpSource::Extensions extensions1 = {
.audio_level = kAudioLevel1,
.absolute_capture_time = kAbsoluteCaptureTime1};
.absolute_capture_time = kAbsoluteCaptureTime1,
.local_capture_clock_offset = kLocalCaptureClockOffset1};
constexpr RtpSource::Extensions extensions2 = {
.audio_level = kAudioLevel2,
.absolute_capture_time = kAbsoluteCaptureTime2};
.absolute_capture_time = kAbsoluteCaptureTime2,
.local_capture_clock_offset = kLocalCaptureClockOffset2};
SimulatedClock clock(1000000000000ULL);
SourceTracker tracker(&clock);
@ -379,7 +414,8 @@ TEST(SourceTrackerTest, OnFrameDeliveredUpdatesSources) {
tracker.OnFrameDelivered(RtpPacketInfos(
{RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
.set_audio_level(kAudioLevel0)
.set_absolute_capture_time(kAbsoluteCaptureTime0)}));
.set_absolute_capture_time(kAbsoluteCaptureTime0)
.set_local_capture_clock_offset(kLocalCaptureClockOffset0)}));
int64_t timestamp_ms_0 = clock.TimeInMilliseconds();
EXPECT_THAT(
@ -397,7 +433,8 @@ TEST(SourceTrackerTest, OnFrameDeliveredUpdatesSources) {
tracker.OnFrameDelivered(RtpPacketInfos(
{RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
.set_audio_level(kAudioLevel1)
.set_absolute_capture_time(kAbsoluteCaptureTime1)}));
.set_absolute_capture_time(kAbsoluteCaptureTime1)
.set_local_capture_clock_offset(kLocalCaptureClockOffset1)}));
int64_t timestamp_ms_1 = clock.TimeInMilliseconds();
@ -418,7 +455,8 @@ TEST(SourceTrackerTest, OnFrameDeliveredUpdatesSources) {
tracker.OnFrameDelivered(RtpPacketInfos(
{RtpPacketInfo(kSsrc2, {kCsrcs0}, kRtpTimestamp2, kReceiveTime2)
.set_audio_level(kAudioLevel2)
.set_absolute_capture_time(kAbsoluteCaptureTime2)}));
.set_absolute_capture_time(kAbsoluteCaptureTime2)
.set_local_capture_clock_offset(kLocalCaptureClockOffset2)}));
int64_t timestamp_ms_2 = clock.TimeInMilliseconds();
@ -449,6 +487,10 @@ TEST(SourceTrackerTest, TimedOutSourcesAreRemoved) {
AbsoluteCaptureTime{12, 34};
constexpr absl::optional<AbsoluteCaptureTime> kAbsoluteCaptureTime1 =
AbsoluteCaptureTime{56, 78};
constexpr absl::optional<TimeDelta> kLocalCaptureClockOffset0 =
TimeDelta::Millis(123);
constexpr absl::optional<TimeDelta> kLocalCaptureClockOffset1 =
TimeDelta::Millis(456);
constexpr Timestamp kReceiveTime0 = Timestamp::Millis(60);
constexpr Timestamp kReceiveTime1 = Timestamp::Millis(61);
@ -458,14 +500,16 @@ TEST(SourceTrackerTest, TimedOutSourcesAreRemoved) {
tracker.OnFrameDelivered(RtpPacketInfos(
{RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
.set_audio_level(kAudioLevel0)
.set_absolute_capture_time(kAbsoluteCaptureTime0)}));
.set_absolute_capture_time(kAbsoluteCaptureTime0)
.set_local_capture_clock_offset(kLocalCaptureClockOffset0)}));
clock.AdvanceTimeMilliseconds(17);
tracker.OnFrameDelivered(RtpPacketInfos(
{RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
.set_audio_level(kAudioLevel1)
.set_absolute_capture_time(kAbsoluteCaptureTime1)}));
.set_absolute_capture_time(kAbsoluteCaptureTime1)
.set_local_capture_clock_offset(kLocalCaptureClockOffset1)}));
int64_t timestamp_ms_1 = clock.TimeInMilliseconds();
@ -473,7 +517,8 @@ TEST(SourceTrackerTest, TimedOutSourcesAreRemoved) {
constexpr RtpSource::Extensions extensions1 = {
.audio_level = kAudioLevel1,
.absolute_capture_time = kAbsoluteCaptureTime1};
.absolute_capture_time = kAbsoluteCaptureTime1,
.local_capture_clock_offset = kLocalCaptureClockOffset1};
EXPECT_THAT(
tracker.GetSources(),