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