• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <decode_buffer.h>
18 
19 namespace {
20 
21 static const size_t kNumberOfBytesPerSample = 2;
22 
23 }  // namespace
24 
DecodeBuffer(size_t sizeOfOneBuffer,size_t maxSize)25 DecodeBuffer::DecodeBuffer(size_t sizeOfOneBuffer, size_t maxSize)
26     : sizeOfOneBuffer_(sizeOfOneBuffer), maxSize_(maxSize),
27       start_(0), end_(0), advancedCount_(0), data_() {
28   Clear();
29 }
30 
~DecodeBuffer()31 DecodeBuffer::~DecodeBuffer() {
32   Clear();
33 }
34 
GetSizeInBytes() const35 size_t DecodeBuffer::GetSizeInBytes() const {
36   return kNumberOfBytesPerSample * (end_ - start_);
37 }
38 
IsTooLarge() const39 bool DecodeBuffer::IsTooLarge() const {
40   return GetSizeInBytes() > maxSize_;
41 }
42 
AddData(int8_t * pointer,size_t lengthInBytes)43 void DecodeBuffer::AddData(int8_t* pointer, size_t lengthInBytes) {
44   for (size_t i = 0; i < lengthInBytes / kNumberOfBytesPerSample; ++i) {
45     PushValue(reinterpret_cast<int16*>(pointer)[i]);
46   }
47 }
48 
Clear()49 void DecodeBuffer::Clear() {
50   while (data_.size() > 0) {
51     delete[] data_.front();
52     data_.erase(data_.begin());
53   }
54   start_ = 0;
55   end_ = 0;
56   advancedCount_ = 0;
57 }
58 
GetTotalAdvancedCount() const59 size_t DecodeBuffer::GetTotalAdvancedCount() const {
60   return advancedCount_;
61 }
62 
AdvanceHeadPointerShorts(size_t numberOfShorts)63 void DecodeBuffer::AdvanceHeadPointerShorts(size_t numberOfShorts) {
64   start_ += numberOfShorts;
65   while (start_ > sizeOfOneBuffer_) {
66     data_.push_back(data_.front());
67     data_.erase(data_.begin());
68     start_ -= sizeOfOneBuffer_;
69     end_ -= sizeOfOneBuffer_;
70   }
71   advancedCount_ += numberOfShorts;
72 }
73 
PushValue(int16 value)74 void DecodeBuffer::PushValue(int16 value) {
75   size_t bufferIndex = end_ / sizeOfOneBuffer_;
76   if (bufferIndex >= data_.size()) {
77     data_.push_back(new int16[sizeOfOneBuffer_]);
78   }
79   data_.at(bufferIndex)[end_ % sizeOfOneBuffer_] = value;
80   ++end_;
81 }
82 
GetAtIndex(size_t index)83 int16 DecodeBuffer::GetAtIndex(size_t index) {
84   return data_.at((start_ + index) / sizeOfOneBuffer_)
85       [(start_ + index) % sizeOfOneBuffer_];
86 }
87