| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/byte_queue.h" | 5 #include "media/base/byte_queue.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 | 8 |
| 9 namespace media { | 9 namespace media { |
| 10 | 10 |
| 11 // Default starting size for the queue. | 11 // Default starting size for the queue. |
| 12 enum { kDefaultQueueSize = 1024 }; | 12 enum { kDefaultQueueSize = 1024 }; |
| 13 | 13 |
| 14 ByteQueue::ByteQueue() | 14 ByteQueue::ByteQueue() |
| 15 : buffer_(new uint8[kDefaultQueueSize]), | 15 : buffer_(new uint8_t[kDefaultQueueSize]), |
| 16 size_(kDefaultQueueSize), | 16 size_(kDefaultQueueSize), |
| 17 offset_(0), | 17 offset_(0), |
| 18 used_(0) { | 18 used_(0) {} |
| 19 } | |
| 20 | 19 |
| 21 ByteQueue::~ByteQueue() {} | 20 ByteQueue::~ByteQueue() {} |
| 22 | 21 |
| 23 void ByteQueue::Reset() { | 22 void ByteQueue::Reset() { |
| 24 offset_ = 0; | 23 offset_ = 0; |
| 25 used_ = 0; | 24 used_ = 0; |
| 26 } | 25 } |
| 27 | 26 |
| 28 void ByteQueue::Push(const uint8* data, int size) { | 27 void ByteQueue::Push(const uint8_t* data, int size) { |
| 29 DCHECK(data); | 28 DCHECK(data); |
| 30 DCHECK_GT(size, 0); | 29 DCHECK_GT(size, 0); |
| 31 | 30 |
| 32 size_t size_needed = used_ + size; | 31 size_t size_needed = used_ + size; |
| 33 | 32 |
| 34 // Check to see if we need a bigger buffer. | 33 // Check to see if we need a bigger buffer. |
| 35 if (size_needed > size_) { | 34 if (size_needed > size_) { |
| 36 size_t new_size = 2 * size_; | 35 size_t new_size = 2 * size_; |
| 37 while (size_needed > new_size && new_size > size_) | 36 while (size_needed > new_size && new_size > size_) |
| 38 new_size *= 2; | 37 new_size *= 2; |
| 39 | 38 |
| 40 // Sanity check to make sure we didn't overflow. | 39 // Sanity check to make sure we didn't overflow. |
| 41 CHECK_GT(new_size, size_); | 40 CHECK_GT(new_size, size_); |
| 42 | 41 |
| 43 scoped_ptr<uint8[]> new_buffer(new uint8[new_size]); | 42 scoped_ptr<uint8_t[]> new_buffer(new uint8_t[new_size]); |
| 44 | 43 |
| 45 // Copy the data from the old buffer to the start of the new one. | 44 // Copy the data from the old buffer to the start of the new one. |
| 46 if (used_ > 0) | 45 if (used_ > 0) |
| 47 memcpy(new_buffer.get(), front(), used_); | 46 memcpy(new_buffer.get(), front(), used_); |
| 48 | 47 |
| 49 buffer_.reset(new_buffer.release()); | 48 buffer_.reset(new_buffer.release()); |
| 50 size_ = new_size; | 49 size_ = new_size; |
| 51 offset_ = 0; | 50 offset_ = 0; |
| 52 } else if ((offset_ + used_ + size) > size_) { | 51 } else if ((offset_ + used_ + size) > size_) { |
| 53 // The buffer is big enough, but we need to move the data in the queue. | 52 // The buffer is big enough, but we need to move the data in the queue. |
| 54 memmove(buffer_.get(), front(), used_); | 53 memmove(buffer_.get(), front(), used_); |
| 55 offset_ = 0; | 54 offset_ = 0; |
| 56 } | 55 } |
| 57 | 56 |
| 58 memcpy(front() + used_, data, size); | 57 memcpy(front() + used_, data, size); |
| 59 used_ += size; | 58 used_ += size; |
| 60 } | 59 } |
| 61 | 60 |
| 62 void ByteQueue::Peek(const uint8** data, int* size) const { | 61 void ByteQueue::Peek(const uint8_t** data, int* size) const { |
| 63 DCHECK(data); | 62 DCHECK(data); |
| 64 DCHECK(size); | 63 DCHECK(size); |
| 65 *data = front(); | 64 *data = front(); |
| 66 *size = used_; | 65 *size = used_; |
| 67 } | 66 } |
| 68 | 67 |
| 69 void ByteQueue::Pop(int count) { | 68 void ByteQueue::Pop(int count) { |
| 70 DCHECK_LE(count, used_); | 69 DCHECK_LE(count, used_); |
| 71 | 70 |
| 72 offset_ += count; | 71 offset_ += count; |
| 73 used_ -= count; | 72 used_ -= count; |
| 74 | 73 |
| 75 // Move the offset back to 0 if we have reached the end of the buffer. | 74 // Move the offset back to 0 if we have reached the end of the buffer. |
| 76 if (offset_ == size_) { | 75 if (offset_ == size_) { |
| 77 DCHECK_EQ(used_, 0); | 76 DCHECK_EQ(used_, 0); |
| 78 offset_ = 0; | 77 offset_ = 0; |
| 79 } | 78 } |
| 80 } | 79 } |
| 81 | 80 |
| 82 uint8* ByteQueue::front() const { return buffer_.get() + offset_; } | 81 uint8_t* ByteQueue::front() const { |
| 82 return buffer_.get() + offset_; |
| 83 } |
| 83 | 84 |
| 84 } // namespace media | 85 } // namespace media |
| OLD | NEW |