diff options
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.cc | 71 |
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 |