Chromium Code Reviews| Index: media/base/seekable_buffer.cc |
| diff --git a/media/base/seekable_buffer.cc b/media/base/seekable_buffer.cc |
| index b9ad7a43013e7f121c6aace8c3c1ac2d8fbfe26b..c16227a3d8713f6becdac34e28908ac0722575a1 100644 |
| --- a/media/base/seekable_buffer.cc |
| +++ b/media/base/seekable_buffer.cc |
| @@ -36,12 +36,17 @@ void SeekableBuffer::Clear() { |
| size_t SeekableBuffer::Read(uint8* data, size_t size) { |
| DCHECK(data); |
| - return InternalRead(data, size, true); |
| + return InternalRead(data, size, true, 0); |
| } |
| size_t SeekableBuffer::Peek(uint8* data, size_t size) { |
| DCHECK(data); |
| - return InternalRead(data, size, false); |
| + return InternalRead(data, size, false, 0); |
|
acolwell GONE FROM CHROMIUM
2012/02/22 07:51:40
nit:How about removing DCHECK & just calling Peek(
vrk (LEFT CHROMIUM)
2012/02/23 20:33:06
D'oh! Yes, that would make sense, thanks :)
|
| +} |
| + |
| +size_t SeekableBuffer::Peek(uint8* data, size_t size, size_t forward_offset) { |
| + DCHECK(data); |
| + return InternalRead(data, size, false, forward_offset); |
| } |
| bool SeekableBuffer::GetCurrentChunk(const uint8** data, size_t* size) const { |
| @@ -113,7 +118,7 @@ bool SeekableBuffer::SeekForward(size_t size) { |
| return false; |
| // Do a read of |size| bytes. |
| - size_t taken = InternalRead(NULL, size, true); |
| + size_t taken = InternalRead(NULL, size, true, 0); |
| DCHECK_EQ(taken, size); |
| return true; |
| } |
| @@ -183,13 +188,15 @@ void SeekableBuffer::EvictBackwardBuffers() { |
| } |
| size_t SeekableBuffer::InternalRead(uint8* data, size_t size, |
| - bool advance_position) { |
| + bool advance_position, |
| + size_t forward_offset) { |
| // Counts how many bytes are actually read from the buffer queue. |
| size_t taken = 0; |
| BufferQueue::iterator current_buffer = current_buffer_; |
| size_t current_buffer_offset = current_buffer_offset_; |
| + size_t bytes_to_skip = forward_offset; |
| while (taken < size) { |
| // |current_buffer| is valid since the first time this buffer is appended |
| // with data. |
| @@ -198,22 +205,31 @@ size_t SeekableBuffer::InternalRead(uint8* data, size_t size, |
| scoped_refptr<Buffer> buffer = *current_buffer; |
| - // Find the right amount to copy from the current buffer referenced by |
| - // |buffer|. We shall copy no more than |size| bytes in total and each |
| - // single step copied no more than the current buffer size. |
| - size_t copied = std::min(size - taken, |
| - buffer->GetDataSize() - current_buffer_offset); |
| - |
| - // |data| is NULL if we are seeking forward, so there's no need to copy. |
| - if (data) |
| - memcpy(data + taken, buffer->GetData() + current_buffer_offset, copied); |
| - |
| - // Increase total number of bytes copied, which regulates when to end this |
| - // loop. |
| - taken += copied; |
| - |
| - // We have read |copied| bytes from the current buffer. Advances the offset. |
| - current_buffer_offset += copied; |
| + size_t remaining_bytes_in_buffer = |
| + buffer->GetDataSize() - current_buffer_offset; |
| + |
| + if (bytes_to_skip == 0) { |
| + // Find the right amount to copy from the current buffer referenced by |
| + // |buffer|. We shall copy no more than |size| bytes in total and each |
| + // single step copied no more than the current buffer size. |
| + size_t copied = std::min(size - taken, remaining_bytes_in_buffer); |
| + |
| + // |data| is NULL if we are seeking forward, so there's no need to copy. |
| + if (data) |
| + memcpy(data + taken, buffer->GetData() + current_buffer_offset, copied); |
| + |
| + // Increase total number of bytes copied, which regulates when to end this |
| + // loop. |
| + taken += copied; |
| + |
| + // We have read |copied| bytes from the current buffer. Advances the |
| + // offset. |
| + current_buffer_offset += copied; |
| + } else { |
| + size_t skipped = std::min(remaining_bytes_in_buffer, bytes_to_skip); |
| + current_buffer_offset += skipped; |
| + bytes_to_skip -= skipped; |
| + } |
| // The buffer has been consumed. |
| if (current_buffer_offset == buffer->GetDataSize()) { |