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