summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 23:16:00 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 23:16:00 +0000
commit01c41dc19a7706176785b426dccf97f4e24e7270 (patch)
tree804bf8e62563b94a435e6b5098855c604561339b /media/base
parent2e03945a0cb0d34b784e985af3fc05f6ad59ceff (diff)
downloadchromium_src-01c41dc19a7706176785b426dccf97f4e24e7270.zip
chromium_src-01c41dc19a7706176785b426dccf97f4e24e7270.tar.gz
chromium_src-01c41dc19a7706176785b426dccf97f4e24e7270.tar.bz2
Removed AlsaPcmOutputStrem::Packet. Fixed bug in AlsaPcmOutputStream::ScheduleNextWrite which would cause high CPU consumption.
BUG=28654 TEST=Audio still works on Linux Review URL: http://codereview.chromium.org/2008010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47333 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base')
-rw-r--r--media/base/seekable_buffer.cc16
-rw-r--r--media/base/seekable_buffer.h7
-rw-r--r--media/base/seekable_buffer_unittest.cc22
3 files changed, 45 insertions, 0 deletions
diff --git a/media/base/seekable_buffer.cc b/media/base/seekable_buffer.cc
index 0f1cc33c..15819c1 100644
--- a/media/base/seekable_buffer.cc
+++ b/media/base/seekable_buffer.cc
@@ -44,6 +44,22 @@ size_t SeekableBuffer::Peek(uint8* data, size_t size) {
return InternalRead(data, size, false);
}
+bool SeekableBuffer::GetCurrentChunk(const uint8** data, size_t* size) const {
+ BufferQueue::iterator current_buffer = current_buffer_;
+ size_t current_buffer_offset = current_buffer_offset_;
+ // Advance position if we are in the end of the current buffer.
+ while (current_buffer != buffers_.end() &&
+ current_buffer_offset >= (*current_buffer)->GetDataSize()) {
+ ++current_buffer;
+ current_buffer_offset = 0;
+ }
+ if (current_buffer == buffers_.end())
+ return false;
+ *data = (*current_buffer)->GetData() + current_buffer_offset;
+ *size = (*current_buffer)->GetDataSize() - current_buffer_offset;
+ return true;
+}
+
bool SeekableBuffer::Append(Buffer* buffer_in) {
if (buffers_.empty() && buffer_in->GetTimestamp().InMicroseconds() > 0) {
current_time_ = buffer_in->GetTimestamp();
diff --git a/media/base/seekable_buffer.h b/media/base/seekable_buffer.h
index 9275cf8..1a423e0 100644
--- a/media/base/seekable_buffer.h
+++ b/media/base/seekable_buffer.h
@@ -64,6 +64,13 @@ class SeekableBuffer {
// number of bytes copied. Doesn't advance current position.
size_t Peek(uint8* data, size_t size);
+ // Returns pointer to the current chunk of data that is being consumed.
+ // If there is no data left in the buffer false is returned, otherwise
+ // true is returned and |data| and |size| are updated. The returned
+ // |data| value becomes invalid when Read(), Append() or Seek()
+ // are called.
+ bool GetCurrentChunk(const uint8** data, size_t* size) const;
+
// Appends |buffer_in| to this buffer. Returns false if forward_bytes() is
// greater than or equals to forward_capacity(), true otherwise. The data
// is added to the buffer in any case.
diff --git a/media/base/seekable_buffer_unittest.cc b/media/base/seekable_buffer_unittest.cc
index 333833e..72e1933 100644
--- a/media/base/seekable_buffer_unittest.cc
+++ b/media/base/seekable_buffer_unittest.cc
@@ -222,6 +222,28 @@ TEST_F(SeekableBufferTest, SeekBackward) {
}
}
+TEST_F(SeekableBufferTest, GetCurrentChunk) {
+ const size_t kSeekSize = kWriteSize / 3;
+
+ scoped_refptr<media::DataBuffer> buffer = new media::DataBuffer(kWriteSize);
+ memcpy(buffer->GetWritableData(), data_, kWriteSize);
+ buffer->SetDataSize(kWriteSize);
+
+ const uint8* data;
+ size_t size;
+ EXPECT_FALSE(buffer_.GetCurrentChunk(&data, &size));
+
+ buffer_.Append(buffer.get());
+ EXPECT_TRUE(buffer_.GetCurrentChunk(&data, &size));
+ EXPECT_EQ(data, buffer->GetData());
+ EXPECT_EQ(size, buffer->GetDataSize());
+
+ buffer_.Seek(kSeekSize);
+ EXPECT_TRUE(buffer_.GetCurrentChunk(&data, &size));
+ EXPECT_EQ(data, buffer->GetData() + kSeekSize);
+ EXPECT_EQ(size, buffer->GetDataSize() - kSeekSize);
+}
+
TEST_F(SeekableBufferTest, SeekForward) {
size_t write_position = 0;
size_t read_position = 0;