/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace { static const size_t kNumberOfBytesPerSample = 2; } // namespace DecodeBuffer::DecodeBuffer(size_t sizeOfOneBuffer, size_t maxSize) : sizeOfOneBuffer_(sizeOfOneBuffer), maxSize_(maxSize), start_(0), end_(0), advancedCount_(0), data_() { Clear(); } DecodeBuffer::~DecodeBuffer() { Clear(); } size_t DecodeBuffer::GetSizeInBytes() const { return kNumberOfBytesPerSample * (end_ - start_); } bool DecodeBuffer::IsTooLarge() const { return GetSizeInBytes() > maxSize_; } void DecodeBuffer::AddData(int8_t* pointer, size_t lengthInBytes) { for (size_t i = 0; i < lengthInBytes / kNumberOfBytesPerSample; ++i) { PushValue(reinterpret_cast(pointer)[i]); } } void DecodeBuffer::Clear() { while (data_.size() > 0) { delete[] data_.front(); data_.erase(data_.begin()); } start_ = 0; end_ = 0; advancedCount_ = 0; } size_t DecodeBuffer::GetTotalAdvancedCount() const { return advancedCount_; } void DecodeBuffer::AdvanceHeadPointerShorts(size_t numberOfShorts) { start_ += numberOfShorts; while (start_ > sizeOfOneBuffer_) { data_.push_back(data_.front()); data_.erase(data_.begin()); start_ -= sizeOfOneBuffer_; end_ -= sizeOfOneBuffer_; } advancedCount_ += numberOfShorts; } void DecodeBuffer::PushValue(int16 value) { size_t bufferIndex = end_ / sizeOfOneBuffer_; if (bufferIndex >= data_.size()) { data_.push_back(new int16[sizeOfOneBuffer_]); } data_.at(bufferIndex)[end_ % sizeOfOneBuffer_] = value; ++end_; } int16 DecodeBuffer::GetAtIndex(size_t index) { return data_.at((start_ + index) / sizeOfOneBuffer_) [(start_ + index) % sizeOfOneBuffer_]; }