1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2015 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer_queue.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
14*d9f75844SAndroid Build Coastguard Worker #include <string.h>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include <algorithm>
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker namespace rtc {
19*d9f75844SAndroid Build Coastguard Worker
BufferQueue(size_t capacity,size_t default_size)20*d9f75844SAndroid Build Coastguard Worker BufferQueue::BufferQueue(size_t capacity, size_t default_size)
21*d9f75844SAndroid Build Coastguard Worker : capacity_(capacity), default_size_(default_size) {}
22*d9f75844SAndroid Build Coastguard Worker
~BufferQueue()23*d9f75844SAndroid Build Coastguard Worker BufferQueue::~BufferQueue() {
24*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&sequence_checker_);
25*d9f75844SAndroid Build Coastguard Worker for (Buffer* buffer : queue_)
26*d9f75844SAndroid Build Coastguard Worker delete buffer;
27*d9f75844SAndroid Build Coastguard Worker for (Buffer* buffer : free_list_)
28*d9f75844SAndroid Build Coastguard Worker delete buffer;
29*d9f75844SAndroid Build Coastguard Worker }
30*d9f75844SAndroid Build Coastguard Worker
size() const31*d9f75844SAndroid Build Coastguard Worker size_t BufferQueue::size() const {
32*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&sequence_checker_);
33*d9f75844SAndroid Build Coastguard Worker return queue_.size();
34*d9f75844SAndroid Build Coastguard Worker }
35*d9f75844SAndroid Build Coastguard Worker
Clear()36*d9f75844SAndroid Build Coastguard Worker void BufferQueue::Clear() {
37*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&sequence_checker_);
38*d9f75844SAndroid Build Coastguard Worker while (!queue_.empty()) {
39*d9f75844SAndroid Build Coastguard Worker free_list_.push_back(queue_.front());
40*d9f75844SAndroid Build Coastguard Worker queue_.pop_front();
41*d9f75844SAndroid Build Coastguard Worker }
42*d9f75844SAndroid Build Coastguard Worker }
43*d9f75844SAndroid Build Coastguard Worker
ReadFront(void * buffer,size_t bytes,size_t * bytes_read)44*d9f75844SAndroid Build Coastguard Worker bool BufferQueue::ReadFront(void* buffer, size_t bytes, size_t* bytes_read) {
45*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&sequence_checker_);
46*d9f75844SAndroid Build Coastguard Worker if (queue_.empty())
47*d9f75844SAndroid Build Coastguard Worker return false;
48*d9f75844SAndroid Build Coastguard Worker
49*d9f75844SAndroid Build Coastguard Worker Buffer* packet = queue_.front();
50*d9f75844SAndroid Build Coastguard Worker queue_.pop_front();
51*d9f75844SAndroid Build Coastguard Worker
52*d9f75844SAndroid Build Coastguard Worker bytes = std::min(bytes, packet->size());
53*d9f75844SAndroid Build Coastguard Worker memcpy(buffer, packet->data(), bytes);
54*d9f75844SAndroid Build Coastguard Worker
55*d9f75844SAndroid Build Coastguard Worker if (bytes_read)
56*d9f75844SAndroid Build Coastguard Worker *bytes_read = bytes;
57*d9f75844SAndroid Build Coastguard Worker
58*d9f75844SAndroid Build Coastguard Worker free_list_.push_back(packet);
59*d9f75844SAndroid Build Coastguard Worker return true;
60*d9f75844SAndroid Build Coastguard Worker }
61*d9f75844SAndroid Build Coastguard Worker
WriteBack(const void * buffer,size_t bytes,size_t * bytes_written)62*d9f75844SAndroid Build Coastguard Worker bool BufferQueue::WriteBack(const void* buffer,
63*d9f75844SAndroid Build Coastguard Worker size_t bytes,
64*d9f75844SAndroid Build Coastguard Worker size_t* bytes_written) {
65*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&sequence_checker_);
66*d9f75844SAndroid Build Coastguard Worker if (queue_.size() == capacity_)
67*d9f75844SAndroid Build Coastguard Worker return false;
68*d9f75844SAndroid Build Coastguard Worker
69*d9f75844SAndroid Build Coastguard Worker Buffer* packet;
70*d9f75844SAndroid Build Coastguard Worker if (!free_list_.empty()) {
71*d9f75844SAndroid Build Coastguard Worker packet = free_list_.back();
72*d9f75844SAndroid Build Coastguard Worker free_list_.pop_back();
73*d9f75844SAndroid Build Coastguard Worker } else {
74*d9f75844SAndroid Build Coastguard Worker packet = new Buffer(bytes, default_size_);
75*d9f75844SAndroid Build Coastguard Worker }
76*d9f75844SAndroid Build Coastguard Worker
77*d9f75844SAndroid Build Coastguard Worker packet->SetData(static_cast<const uint8_t*>(buffer), bytes);
78*d9f75844SAndroid Build Coastguard Worker if (bytes_written)
79*d9f75844SAndroid Build Coastguard Worker *bytes_written = bytes;
80*d9f75844SAndroid Build Coastguard Worker
81*d9f75844SAndroid Build Coastguard Worker queue_.push_back(packet);
82*d9f75844SAndroid Build Coastguard Worker return true;
83*d9f75844SAndroid Build Coastguard Worker }
84*d9f75844SAndroid Build Coastguard Worker
85*d9f75844SAndroid Build Coastguard Worker } // namespace rtc
86