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:
committed by
WebRTC LUCI CQ
parent
54d9f056c6
commit
56b96ffe6a
@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user