| /* |
| * Copyright (c) 2018 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/contributing_sources.h" |
| |
| #include "rtc_base/time_utils.h" |
| |
| #include "test/gmock.h" |
| #include "test/gtest.h" |
| |
| namespace webrtc { |
| namespace { |
| |
| using ::testing::UnorderedElementsAre; |
| |
| constexpr uint32_t kCsrc1 = 111; |
| constexpr uint32_t kCsrc2 = 222; |
| constexpr uint32_t kCsrc3 = 333; |
| constexpr uint32_t kRtpTimestamp1 = 314; |
| constexpr uint32_t kRtpTimestamp2 = 315; |
| constexpr uint32_t kRtpTimestamp3 = 316; |
| |
| } // namespace |
| |
| TEST(ContributingSourcesTest, RecordSources) { |
| ContributingSources csrcs; |
| constexpr uint32_t kCsrcs[] = {kCsrc1, kCsrc2}; |
| constexpr int64_t kTime1 = 10; |
| csrcs.Update(kTime1, kCsrcs, absl::nullopt, kRtpTimestamp1); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime1), |
| UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1), |
| RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1))); |
| } |
| |
| TEST(ContributingSourcesTest, UpdateSources) { |
| ContributingSources csrcs; |
| // TODO(nisse): When migrating to absl::Span, the named constant arrays should |
| // be replaced by unnamed literals where they are passed to csrcs.Update(...). |
| constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2}; |
| constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3}; |
| constexpr int64_t kTime1 = 10; |
| constexpr int64_t kTime2 = kTime1 + 5 * rtc::kNumMillisecsPerSec; |
| csrcs.Update(kTime1, kCsrcs1, absl::nullopt, kRtpTimestamp1); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime1), |
| UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1), |
| RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1))); |
| csrcs.Update(kTime2, kCsrcs2, absl::nullopt, kRtpTimestamp2); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime2), |
| UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1), |
| RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp2), |
| RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp2))); |
| } |
| |
| TEST(ContributingSourcesTest, ReturnRecentOnly) { |
| ContributingSources csrcs; |
| constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2}; |
| constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3}; |
| constexpr int64_t kTime1 = 10; |
| constexpr int64_t kTime2 = kTime1 + 5 * rtc::kNumMillisecsPerSec; |
| constexpr int64_t kTime3 = kTime1 + 12 * rtc::kNumMillisecsPerSec; |
| csrcs.Update(kTime1, kCsrcs1, absl::nullopt, kRtpTimestamp1); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime1), |
| UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1), |
| RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1))); |
| csrcs.Update(kTime2, kCsrcs2, absl::nullopt, kRtpTimestamp2); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime3), |
| UnorderedElementsAre(RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp2), |
| RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp2))); |
| } |
| |
| TEST(ContributingSourcesTest, PurgeOldSources) { |
| ContributingSources csrcs; |
| constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2}; |
| constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3}; |
| constexpr int64_t kTime1 = 10; |
| constexpr int64_t kTime2 = kTime1 + 10 * rtc::kNumMillisecsPerSec; |
| constexpr int64_t kTime3 = kTime1 + 20 * rtc::kNumMillisecsPerSec; |
| csrcs.Update(kTime1, kCsrcs1, absl::nullopt, kRtpTimestamp1); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime2), |
| UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1), |
| RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1))); |
| csrcs.Update(kTime2, kCsrcs2, absl::nullopt, kRtpTimestamp2); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime2), |
| UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp1), |
| RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp2), |
| RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp2))); |
| csrcs.Update(kTime3, kCsrcs2, absl::nullopt, kRtpTimestamp3); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime3), |
| UnorderedElementsAre(RtpSource(kTime3, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp3), |
| RtpSource(kTime3, kCsrc3, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp3))); |
| // Query at an earlier time; check that old sources really have been purged |
| // and don't reappear. |
| EXPECT_THAT( |
| csrcs.GetSources(kTime2), |
| UnorderedElementsAre(RtpSource(kTime3, kCsrc2, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp3), |
| RtpSource(kTime3, kCsrc3, RtpSourceType::CSRC, |
| absl::nullopt, kRtpTimestamp3))); |
| } |
| |
| TEST(ContributingSourcesTest, AudioLevel) { |
| ContributingSources csrcs; |
| constexpr uint32_t kCsrcs[] = {kCsrc1, kCsrc2}; |
| constexpr int64_t kTime1 = 10; |
| csrcs.Update(kTime1, kCsrcs, 47, kRtpTimestamp1); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime1), |
| UnorderedElementsAre( |
| RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, 47, kRtpTimestamp1), |
| RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, 47, kRtpTimestamp1))); |
| |
| constexpr uint32_t kCsrcsSubset[] = {kCsrc1}; |
| csrcs.Update(kTime1 + 1, kCsrcsSubset, absl::nullopt, kRtpTimestamp2); |
| EXPECT_THAT( |
| csrcs.GetSources(kTime1 + 1), |
| UnorderedElementsAre( |
| RtpSource(kTime1 + 1, kCsrc1, RtpSourceType::CSRC, absl::nullopt, |
| kRtpTimestamp2), |
| RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, 47, kRtpTimestamp1))); |
| } |
| |
| } // namespace webrtc |