Remove the old ContributingSources class.
This change removes the old `ContributingSources` class. It has been replaced by the new `SourceTracker`. Bug: webrtc:10793 Change-Id: Ibd481cf6584837c46b229b9fc2a071362f07d361 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/147878 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Chen Xing <chxg@google.com> Cr-Commit-Position: refs/heads/master@{#28756}
This commit is contained in:
@ -131,8 +131,6 @@ rtc_static_library("rtp_rtcp") {
|
|||||||
"include/rtp_header_parser.h",
|
"include/rtp_header_parser.h",
|
||||||
"include/rtp_rtcp.h",
|
"include/rtp_rtcp.h",
|
||||||
"include/ulpfec_receiver.h",
|
"include/ulpfec_receiver.h",
|
||||||
"source/contributing_sources.cc",
|
|
||||||
"source/contributing_sources.h",
|
|
||||||
"source/dtmf_queue.cc",
|
"source/dtmf_queue.cc",
|
||||||
"source/dtmf_queue.h",
|
"source/dtmf_queue.h",
|
||||||
"source/fec_private_tables_bursty.cc",
|
"source/fec_private_tables_bursty.cc",
|
||||||
@ -388,7 +386,6 @@ if (rtc_include_tests) {
|
|||||||
|
|
||||||
sources = [
|
sources = [
|
||||||
"source/byte_io_unittest.cc",
|
"source/byte_io_unittest.cc",
|
||||||
"source/contributing_sources_unittest.cc",
|
|
||||||
"source/fec_private_tables_bursty_unittest.cc",
|
"source/fec_private_tables_bursty_unittest.cc",
|
||||||
"source/flexfec_header_reader_writer_unittest.cc",
|
"source/flexfec_header_reader_writer_unittest.cc",
|
||||||
"source/flexfec_receiver_unittest.cc",
|
"source/flexfec_receiver_unittest.cc",
|
||||||
|
|||||||
@ -1,81 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
namespace webrtc {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// Allow some stale records to accumulate before cleaning.
|
|
||||||
constexpr int64_t kPruningIntervalMs = 15 * rtc::kNumMillisecsPerSec;
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
constexpr int64_t ContributingSources::kHistoryMs;
|
|
||||||
|
|
||||||
ContributingSources::ContributingSources() = default;
|
|
||||||
ContributingSources::~ContributingSources() = default;
|
|
||||||
|
|
||||||
void ContributingSources::Update(int64_t now_ms,
|
|
||||||
rtc::ArrayView<const uint32_t> csrcs,
|
|
||||||
absl::optional<uint8_t> audio_level,
|
|
||||||
uint32_t rtp_timestamp) {
|
|
||||||
Entry entry = {now_ms, audio_level, rtp_timestamp};
|
|
||||||
for (uint32_t csrc : csrcs) {
|
|
||||||
active_csrcs_[csrc] = entry;
|
|
||||||
}
|
|
||||||
if (!next_pruning_ms_) {
|
|
||||||
next_pruning_ms_ = now_ms + kPruningIntervalMs;
|
|
||||||
} else if (now_ms > next_pruning_ms_) {
|
|
||||||
// To prevent unlimited growth, prune it every 15 seconds.
|
|
||||||
DeleteOldEntries(now_ms);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return contributing sources seen the last 10 s.
|
|
||||||
// TODO(nisse): It would be more efficient to delete any stale entries while
|
|
||||||
// iterating over the mapping, but then we'd have to make the method
|
|
||||||
// non-const.
|
|
||||||
std::vector<RtpSource> ContributingSources::GetSources(int64_t now_ms) const {
|
|
||||||
std::vector<RtpSource> sources;
|
|
||||||
for (auto& record : active_csrcs_) {
|
|
||||||
if (record.second.last_seen_ms >= now_ms - kHistoryMs) {
|
|
||||||
sources.emplace_back(record.second.last_seen_ms, record.first,
|
|
||||||
RtpSourceType::CSRC, record.second.audio_level,
|
|
||||||
record.second.rtp_timestamp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sources;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete stale entries.
|
|
||||||
void ContributingSources::DeleteOldEntries(int64_t now_ms) {
|
|
||||||
for (auto it = active_csrcs_.begin(); it != active_csrcs_.end();) {
|
|
||||||
if (it->second.last_seen_ms >= now_ms - kHistoryMs) {
|
|
||||||
// Still relevant.
|
|
||||||
++it;
|
|
||||||
} else {
|
|
||||||
it = active_csrcs_.erase(it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next_pruning_ms_ = now_ms + kPruningIntervalMs;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContributingSources::Entry::Entry() = default;
|
|
||||||
ContributingSources::Entry::Entry(int64_t timestamp_ms,
|
|
||||||
absl::optional<uint8_t> audio_level_arg,
|
|
||||||
uint32_t rtp_timestamp)
|
|
||||||
: last_seen_ms(timestamp_ms),
|
|
||||||
audio_level(audio_level_arg),
|
|
||||||
rtp_timestamp(rtp_timestamp) {}
|
|
||||||
|
|
||||||
} // namespace webrtc
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MODULES_RTP_RTCP_SOURCE_CONTRIBUTING_SOURCES_H_
|
|
||||||
#define MODULES_RTP_RTCP_SOURCE_CONTRIBUTING_SOURCES_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "absl/types/optional.h"
|
|
||||||
#include "api/array_view.h"
|
|
||||||
#include "api/rtp_receiver_interface.h" // For RtpSource
|
|
||||||
#include "rtc_base/time_utils.h" // For kNumMillisecsPerSec
|
|
||||||
|
|
||||||
namespace webrtc {
|
|
||||||
|
|
||||||
class ContributingSources {
|
|
||||||
public:
|
|
||||||
// Set by the spec, see
|
|
||||||
// https://www.w3.org/TR/webrtc/#dom-rtcrtpreceiver-getcontributingsources
|
|
||||||
static constexpr int64_t kHistoryMs = 10 * rtc::kNumMillisecsPerSec;
|
|
||||||
|
|
||||||
ContributingSources();
|
|
||||||
~ContributingSources();
|
|
||||||
|
|
||||||
void Update(int64_t now_ms,
|
|
||||||
rtc::ArrayView<const uint32_t> csrcs,
|
|
||||||
absl::optional<uint8_t> audio_level,
|
|
||||||
uint32_t rtp_timestamp);
|
|
||||||
|
|
||||||
// Returns contributing sources seen the last 10 s.
|
|
||||||
std::vector<RtpSource> GetSources(int64_t now_ms) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct Entry {
|
|
||||||
Entry();
|
|
||||||
Entry(int64_t timestamp_ms,
|
|
||||||
absl::optional<uint8_t> audio_level,
|
|
||||||
uint32_t rtp_timestamp);
|
|
||||||
|
|
||||||
int64_t last_seen_ms;
|
|
||||||
absl::optional<uint8_t> audio_level;
|
|
||||||
uint32_t rtp_timestamp;
|
|
||||||
};
|
|
||||||
|
|
||||||
void DeleteOldEntries(int64_t now_ms);
|
|
||||||
|
|
||||||
// Indexed by csrc.
|
|
||||||
std::map<uint32_t, Entry> active_csrcs_;
|
|
||||||
absl::optional<int64_t> next_pruning_ms_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace webrtc
|
|
||||||
|
|
||||||
#endif // MODULES_RTP_RTCP_SOURCE_CONTRIBUTING_SOURCES_H_
|
|
||||||
@ -1,154 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
@ -30,7 +30,6 @@
|
|||||||
#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
|
#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
|
||||||
#include "modules/rtp_rtcp/include/rtp_rtcp.h"
|
#include "modules/rtp_rtcp/include/rtp_rtcp.h"
|
||||||
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
||||||
#include "modules/rtp_rtcp/source/contributing_sources.h"
|
|
||||||
#include "modules/video_coding/h264_sps_pps_tracker.h"
|
#include "modules/video_coding/h264_sps_pps_tracker.h"
|
||||||
#include "modules/video_coding/loss_notification_controller.h"
|
#include "modules/video_coding/loss_notification_controller.h"
|
||||||
#include "modules/video_coding/packet_buffer.h"
|
#include "modules/video_coding/packet_buffer.h"
|
||||||
|
|||||||
Reference in New Issue
Block a user