blob: defda76f8e3a94a8f445e87cb6705210bd36afe8 [file] [log] [blame]
// 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