mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 14:20:45 +01:00

Removed thread safety: for a low level helper it adds overhead that users may not need. In particular RtpSenderVideo doesn't need it because calls to SendVideo are already synchronized. Added a feature to force producing extension as requested by downstream. Cleanup and document api: Changed rtp_frequency type to int as it has no reason to use uint32_t per style guide Changed absolute_capture_time to NtpTime to clarify both units and offset of the time. NtpTime has trivial conversion to/from uint64_t Documented all the parameters. Cleanup tests. Bug: b/307553606 Change-Id: I0922ca4d3c89f124eeb561742dca79ed5c2327fd Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/325022 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Chen Xing <chxg@google.com> Cr-Commit-Position: refs/heads/main@{#41023}
399 lines
19 KiB
C++
399 lines
19 KiB
C++
/*
|
|
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "modules/rtp_rtcp/source/absolute_capture_time_sender.h"
|
|
|
|
#include "system_wrappers/include/ntp_time.h"
|
|
#include "test/gmock.h"
|
|
#include "test/gtest.h"
|
|
|
|
namespace webrtc {
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, GetSourceWithoutCsrcs) {
|
|
constexpr uint32_t kSsrc = 12;
|
|
|
|
EXPECT_EQ(AbsoluteCaptureTimeSender::GetSource(kSsrc, {}), kSsrc);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, GetSourceWithCsrcs) {
|
|
constexpr uint32_t kSsrc = 12;
|
|
constexpr uint32_t kCsrcs[] = {34, 56, 78, 90};
|
|
|
|
EXPECT_EQ(AbsoluteCaptureTimeSender::GetSource(kSsrc, kCsrcs), kCsrcs[0]);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, InterpolateLaterPacketSentLater) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
Int64MsToQ32x32(-350)};
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, InterpolateEarlierPacketSentLater) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 - 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 - 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 - 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 - 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest,
|
|
InterpolateLaterPacketSentLaterWithRtpTimestampWrapAround) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = uint32_t{0} - 80;
|
|
constexpr uint32_t kRtpTimestamp1 = 1280 - 80;
|
|
constexpr uint32_t kRtpTimestamp2 = 2560 - 80;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest,
|
|
InterpolateEarlierPacketSentLaterWithRtpTimestampWrapAround) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 799;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 - 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 - 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 - 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 - 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateIfTooLate) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
clock.AdvanceTime(AbsoluteCaptureTimeSender::kInterpolationMaxInterval);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
|
|
clock.AdvanceTime(TimeDelta::Millis(1));
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
kExtension2);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateIfSourceChanged) {
|
|
constexpr uint32_t kSource0 = 1337;
|
|
constexpr uint32_t kSource1 = 1338;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource0, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource1, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
kExtension1);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource1, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateWhenForced) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset,
|
|
/*force=*/true),
|
|
kExtension1);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset,
|
|
/*force=*/false),
|
|
absl::nullopt);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateIfRtpClockFrequencyChanged) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency0 = 64'000;
|
|
constexpr int kRtpClockFrequency1 = 32'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 640;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 1280;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency0,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency1,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
kExtension1);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency1,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest,
|
|
SkipInterpolateIfRtpClockFrequencyIsInvalid) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 0;
|
|
constexpr uint32_t kRtpTimestamp = 1020300000;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
kExtension1);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
kExtension2);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest,
|
|
SkipInterpolateIfEstimatedCaptureClockOffsetChanged) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
|
|
Int64MsToQ32x32(370)};
|
|
const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
|
|
absl::nullopt};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
kExtension1);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
kExtension2);
|
|
}
|
|
|
|
TEST(AbsoluteCaptureTimeSenderTest,
|
|
SkipInterpolateIfTooMuchInterpolationError) {
|
|
constexpr uint32_t kSource = 1337;
|
|
constexpr int kRtpClockFrequency = 64'000;
|
|
constexpr uint32_t kRtpTimestamp0 = 1020300000;
|
|
constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
|
|
constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
|
|
const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension1 = {
|
|
Int64MsToUQ32x32(9000 + 20 +
|
|
AbsoluteCaptureTimeSender::kInterpolationMaxError.ms()),
|
|
Int64MsToQ32x32(-350)};
|
|
const AbsoluteCaptureTime kExtension2 = {
|
|
Int64MsToUQ32x32(9000 + 40 +
|
|
AbsoluteCaptureTimeSender::kInterpolationMaxError.ms() +
|
|
1),
|
|
Int64MsToQ32x32(-350)};
|
|
|
|
SimulatedClock clock(0);
|
|
AbsoluteCaptureTimeSender sender(&clock);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
|
|
NtpTime(kExtension0.absolute_capture_timestamp),
|
|
kExtension0.estimated_capture_clock_offset),
|
|
kExtension0);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
|
|
NtpTime(kExtension1.absolute_capture_timestamp),
|
|
kExtension1.estimated_capture_clock_offset),
|
|
absl::nullopt);
|
|
|
|
EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
|
|
NtpTime(kExtension2.absolute_capture_timestamp),
|
|
kExtension2.estimated_capture_clock_offset),
|
|
kExtension2);
|
|
}
|
|
|
|
} // namespace webrtc
|