summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/media/engine/unhandled_packets_buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/media/engine/unhandled_packets_buffer.cc')
-rw-r--r--third_party/libwebrtc/media/engine/unhandled_packets_buffer.cc68
1 files changed, 68 insertions, 0 deletions
diff --git a/third_party/libwebrtc/media/engine/unhandled_packets_buffer.cc b/third_party/libwebrtc/media/engine/unhandled_packets_buffer.cc
new file mode 100644
index 0000000000..563712bdf3
--- /dev/null
+++ b/third_party/libwebrtc/media/engine/unhandled_packets_buffer.cc
@@ -0,0 +1,68 @@
+/*
+ * 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 "media/engine/unhandled_packets_buffer.h"
+
+#include "absl/algorithm/container.h"
+#include "rtc_base/logging.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace cricket {
+
+UnhandledPacketsBuffer::UnhandledPacketsBuffer() {
+ buffer_.reserve(kMaxStashedPackets);
+}
+
+UnhandledPacketsBuffer::~UnhandledPacketsBuffer() = default;
+
+// Store packet in buffer.
+void UnhandledPacketsBuffer::AddPacket(uint32_t ssrc,
+ int64_t packet_time_us,
+ rtc::CopyOnWriteBuffer packet) {
+ if (buffer_.size() < kMaxStashedPackets) {
+ buffer_.push_back({ssrc, packet_time_us, packet});
+ } else {
+ RTC_DCHECK_LT(insert_pos_, kMaxStashedPackets);
+ buffer_[insert_pos_] = {ssrc, packet_time_us, packet};
+ }
+ insert_pos_ = (insert_pos_ + 1) % kMaxStashedPackets;
+}
+
+// Backfill `consumer` with all stored packet related `ssrcs`.
+void UnhandledPacketsBuffer::BackfillPackets(
+ rtc::ArrayView<const uint32_t> ssrcs,
+ std::function<void(uint32_t, int64_t, rtc::CopyOnWriteBuffer)> consumer) {
+ size_t start;
+ if (buffer_.size() < kMaxStashedPackets) {
+ start = 0;
+ } else {
+ start = insert_pos_;
+ }
+
+ std::vector<PacketWithMetadata> remaining;
+ remaining.reserve(kMaxStashedPackets);
+ for (size_t i = 0; i < buffer_.size(); ++i) {
+ const size_t pos = (i + start) % kMaxStashedPackets;
+
+ // One or maybe 2 ssrcs is expected => loop array instead of more elaborate
+ // scheme.
+ const uint32_t ssrc = buffer_[pos].ssrc;
+ if (absl::c_linear_search(ssrcs, ssrc)) {
+ consumer(ssrc, buffer_[pos].packet_time_us, buffer_[pos].packet);
+ } else {
+ remaining.push_back(buffer_[pos]);
+ }
+ }
+
+ insert_pos_ = 0; // insert_pos is only used when buffer is full.
+ buffer_.swap(remaining);
+}
+
+} // namespace cricket