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 |