summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.cc')
-rw-r--r--chromium/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.cc71
1 files changed, 71 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.cc b/chromium/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.cc
new file mode 100644
index 00000000000..defda76f8e3
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.cc
@@ -0,0 +1,71 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.h"
+
+namespace blink {
+
+wtf_size_t ByteBufferQueue::ReadInto(base::span<uint8_t> buffer_out) {
+ wtf_size_t read_amount = 0;
+ while (!buffer_out.empty() && !deque_of_buffers_.empty()) {
+ base::span<const uint8_t> front_buffer =
+ base::make_span(deque_of_buffers_.front())
+ .subspan(front_buffer_offset_);
+ DCHECK_GT(front_buffer.size(), 0u);
+ wtf_size_t buffer_read_amount =
+ std::min(buffer_out.size(), front_buffer.size());
+ memcpy(buffer_out.data(), front_buffer.data(), buffer_read_amount);
+ read_amount += buffer_read_amount;
+ buffer_out = buffer_out.subspan(buffer_read_amount);
+ if (buffer_read_amount < front_buffer.size()) {
+ front_buffer_offset_ += buffer_read_amount;
+ } else {
+ deque_of_buffers_.pop_front();
+ front_buffer_offset_ = 0;
+ }
+ }
+ size_ -= read_amount;
+#if DCHECK_IS_ON()
+ CheckInvariants();
+#endif
+ return read_amount;
+}
+
+void ByteBufferQueue::Append(Vector<uint8_t> buffer) {
+ if (buffer.IsEmpty()) {
+ return;
+ }
+ size_ += buffer.size();
+ deque_of_buffers_.push_back(std::move(buffer));
+#if DCHECK_IS_ON()
+ CheckInvariants();
+#endif
+}
+
+void ByteBufferQueue::Clear() {
+ deque_of_buffers_.clear();
+ front_buffer_offset_ = 0;
+ size_ = 0;
+#if DCHECK_IS_ON()
+ CheckInvariants();
+#endif
+}
+
+#if DCHECK_IS_ON()
+void ByteBufferQueue::CheckInvariants() const {
+ wtf_size_t buffer_size_sum = 0;
+ for (const auto& buffer : deque_of_buffers_) {
+ DCHECK(!buffer.IsEmpty());
+ buffer_size_sum += buffer.size();
+ }
+ DCHECK_EQ(size_, buffer_size_sum - front_buffer_offset_);
+ if (deque_of_buffers_.empty()) {
+ DCHECK_EQ(front_buffer_offset_, 0u);
+ } else {
+ DCHECK_LT(front_buffer_offset_, deque_of_buffers_.front().size());
+ }
+}
+#endif
+
+} // namespace blink