Index: media/base/audio_buffer_queue_unittest.cc |
diff --git a/media/base/audio_buffer_queue_unittest.cc b/media/base/audio_buffer_queue_unittest.cc |
index e6a148ae21bba7940e71e12a70989b4451f1cfdf..fc048573e10a3d50bd4749f52858cc24407f0c18 100644 |
--- a/media/base/audio_buffer_queue_unittest.cc |
+++ b/media/base/audio_buffer_queue_unittest.cc |
@@ -5,6 +5,7 @@ |
#include "base/basictypes.h" |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/strings/stringprintf.h" |
#include "base/time/time.h" |
#include "media/base/audio_buffer.h" |
#include "media/base/audio_buffer_queue.h" |
@@ -17,18 +18,15 @@ |
const int kSampleRate = 44100; |
-static void VerifyBus(AudioBus* bus, |
- int offset, |
- int frames, |
- int buffer_size, |
- float start, |
- float increment) { |
- for (int ch = 0; ch < bus->channels(); ++ch) { |
- const float v = start + ch * buffer_size * increment; |
- for (int i = offset; i < frames; ++i) { |
- ASSERT_FLOAT_EQ(v + (i - offset) * increment, bus->channel(ch)[i]) |
- << "i=" << i << ", ch=" << ch; |
- } |
+static void VerifyResult(float* channel_data, |
+ int frames, |
+ float start, |
+ float increment) { |
+ for (int i = 0; i < frames; ++i) { |
+ SCOPED_TRACE(base::StringPrintf( |
+ "i=%d/%d start=%f, increment=%f", i, frames, start, increment)); |
+ ASSERT_EQ(start, channel_data[i]); |
+ start += increment; |
} |
} |
@@ -36,16 +34,18 @@ |
static scoped_refptr<AudioBuffer> MakeTestBuffer(SampleFormat format, |
ChannelLayout channel_layout, |
T start, |
- T step, |
+ T end, |
int frames) { |
+ const base::TimeDelta kNoTime = kNoTimestamp(); |
return MakeAudioBuffer<T>(format, |
channel_layout, |
ChannelLayoutToChannelCount(channel_layout), |
kSampleRate, |
start, |
- step, |
+ end, |
frames, |
- kNoTimestamp()); |
+ kNoTime, |
+ kNoTime); |
} |
TEST(AudioBufferQueueTest, AppendAndClear) { |
@@ -96,7 +96,7 @@ |
EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); |
EXPECT_EQ(4, buffer.frames()); |
- VerifyBus(bus.get(), 0, 4, bus->frames(), 10, 1); |
+ VerifyResult(bus->channel(0), 4, 10.0f, 1.0f); |
buffer.Append(MakeTestBuffer<float>( |
kSampleFormatF32, channel_layout, 20.0f, 1.0f, 8)); |
@@ -108,7 +108,7 @@ |
buffer.SeekFrames(16); |
EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); |
EXPECT_EQ(0, buffer.frames()); |
- VerifyBus(bus.get(), 0, 4, bus->frames(), 34, 1); |
+ VerifyResult(bus->channel(0), 4, 34.0f, 1.0f); |
buffer.Append(MakeTestBuffer<float>( |
kSampleFormatF32, channel_layout, 40.0f, 1.0f, 8)); |
@@ -118,13 +118,13 @@ |
EXPECT_EQ(16, buffer.frames()); |
EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); |
- VerifyBus(bus.get(), 0, 4, bus->frames(), 40, 1); |
+ VerifyResult(bus->channel(0), 4, 40.0f, 1.0f); |
// Read off the end of the buffer. |
EXPECT_EQ(12, buffer.frames()); |
buffer.SeekFrames(8); |
EXPECT_EQ(4, buffer.ReadFrames(100, 0, bus.get())); |
- VerifyBus(bus.get(), 0, 4, bus->frames(), 54, 1); |
+ VerifyResult(bus->channel(0), 4, 54.0f, 1.0f); |
} |
TEST(AudioBufferQueueTest, Seek) { |
@@ -162,17 +162,19 @@ |
MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 33.0f, 1.0f, 60)); |
EXPECT_EQ(76, buffer.frames()); |
- // Read 3 frames from the buffer. |
+ // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be |
+ // 1, 3, 5, and ch[1] should be 2, 4, 6. |
scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
EXPECT_EQ(3, buffer.ReadFrames(3, 0, bus.get())); |
EXPECT_EQ(73, buffer.frames()); |
- VerifyBus(bus.get(), 0, 3, 6, 1, 1); |
+ VerifyResult(bus->channel(0), 3, 1.0f, 2.0f); |
+ VerifyResult(bus->channel(1), 3, 2.0f, 2.0f); |
// Now read 5 frames, which will span buffers. Append the data into AudioBus. |
EXPECT_EQ(5, buffer.ReadFrames(5, 3, bus.get())); |
EXPECT_EQ(68, buffer.frames()); |
- VerifyBus(bus.get(), 0, 6, 6, 1, 1); |
- VerifyBus(bus.get(), 6, 2, 10, 13, 1); |
+ VerifyResult(bus->channel(0), 8, 1.0f, 2.0f); |
+ VerifyResult(bus->channel(1), 8, 2.0f, 2.0f); |
// Now skip into the third buffer. |
buffer.SeekFrames(20); |
@@ -180,24 +182,30 @@ |
// Now read 2 frames, which are in the third buffer. |
EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); |
- VerifyBus(bus.get(), 0, 2, 60, 45, 1); |
+ VerifyResult(bus->channel(0), 2, 57.0f, 2.0f); |
+ VerifyResult(bus->channel(1), 2, 58.0f, 2.0f); |
} |
TEST(AudioBufferQueueTest, ReadU8) { |
const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
const int channels = ChannelLayoutToChannelCount(channel_layout); |
- const int frames = 4; |
AudioBufferQueue buffer; |
// Add 4 frames of data. |
buffer.Append( |
- MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 128, 1, frames)); |
- |
- // Read all 4 frames from the buffer. |
- scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
- EXPECT_EQ(frames, buffer.ReadFrames(frames, 0, bus.get())); |
+ MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 128, 1, 4)); |
+ |
+ // Read all 4 frames from the buffer. Data is interleaved, so ch[0] should be |
+ // 128, 132, 136, 140, other channels similar. However, values are converted |
+ // from [0, 255] to [-1.0, 1.0] with a bias of 128. Thus the first buffer |
+ // value should be 0.0, then 1/127, 2/127, etc. |
+ scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
+ EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); |
EXPECT_EQ(0, buffer.frames()); |
- VerifyBus(bus.get(), 0, frames, bus->frames(), 0, 1.0f / 127.0f); |
+ VerifyResult(bus->channel(0), 4, 0.0f, 4.0f / 127.0f); |
+ VerifyResult(bus->channel(1), 4, 1.0f / 127.0f, 4.0f / 127.0f); |
+ VerifyResult(bus->channel(2), 4, 2.0f / 127.0f, 4.0f / 127.0f); |
+ VerifyResult(bus->channel(3), 4, 3.0f / 127.0f, 4.0f / 127.0f); |
} |
TEST(AudioBufferQueueTest, ReadS16) { |
@@ -212,13 +220,14 @@ |
MakeTestBuffer<int16>(kSampleFormatS16, channel_layout, 9, 1, 20)); |
EXPECT_EQ(24, buffer.frames()); |
- // Read 6 frames from the buffer. |
- const int frames = 6; |
- scoped_ptr<AudioBus> bus = AudioBus::Create(channels, buffer.frames()); |
- EXPECT_EQ(frames, buffer.ReadFrames(frames, 0, bus.get())); |
+ // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be |
+ // 1, 3, 5, 7, 9, 11, and ch[1] should be 2, 4, 6, 8, 10, 12. |
+ // Data is converted to float from -1.0 to 1.0 based on int16 range. |
+ scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
+ EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); |
EXPECT_EQ(18, buffer.frames()); |
- VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint16max, 1.0f / kint16max); |
- VerifyBus(bus.get(), 4, 2, 20, 9.0f / kint16max, 1.0f / kint16max); |
+ VerifyResult(bus->channel(0), 6, 1.0f / kint16max, 2.0f / kint16max); |
+ VerifyResult(bus->channel(1), 6, 2.0f / kint16max, 2.0f / kint16max); |
} |
TEST(AudioBufferQueueTest, ReadS32) { |
@@ -233,17 +242,20 @@ |
MakeTestBuffer<int32>(kSampleFormatS32, channel_layout, 9, 1, 20)); |
EXPECT_EQ(24, buffer.frames()); |
- // Read 6 frames from the buffer. |
+ // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be |
+ // 1, 3, 5, 7, 100, 106, and ch[1] should be 2, 4, 6, 8, 103, 109. |
+ // Data is converted to float from -1.0 to 1.0 based on int32 range. |
scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); |
EXPECT_EQ(18, buffer.frames()); |
- VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint32max, 1.0f / kint32max); |
- VerifyBus(bus.get(), 4, 2, 20, 9.0f / kint32max, 1.0f / kint32max); |
+ VerifyResult(bus->channel(0), 6, 1.0f / kint32max, 2.0f / kint32max); |
+ VerifyResult(bus->channel(1), 6, 2.0f / kint32max, 2.0f / kint32max); |
// Read the next 2 frames. |
EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); |
EXPECT_EQ(16, buffer.frames()); |
- VerifyBus(bus.get(), 0, 2, 20, 11.0f / kint32max, 1.0f / kint32max); |
+ VerifyResult(bus->channel(0), 2, 13.0f / kint32max, 2.0f / kint32max); |
+ VerifyResult(bus->channel(1), 2, 14.0f / kint32max, 2.0f / kint32max); |
} |
TEST(AudioBufferQueueTest, ReadF32Planar) { |
@@ -258,12 +270,15 @@ |
kSampleFormatPlanarF32, channel_layout, 50.0f, 1.0f, 10)); |
EXPECT_EQ(14, buffer.frames()); |
- // Read 6 frames from the buffer. |
+ // Read 6 frames from the buffer. F32 is planar, so ch[0] should be |
+ // 1, 2, 3, 4, 50, 51, and ch[1] should be 5, 6, 7, 8, 60, 61. |
scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); |
EXPECT_EQ(8, buffer.frames()); |
- VerifyBus(bus.get(), 0, 4, 4, 1, 1); |
- VerifyBus(bus.get(), 4, 2, 10, 50, 1); |
+ VerifyResult(bus->channel(0), 4, 1.0f, 1.0f); |
+ VerifyResult(bus->channel(0) + 4, 2, 50.0f, 1.0f); |
+ VerifyResult(bus->channel(1), 4, 5.0f, 1.0f); |
+ VerifyResult(bus->channel(1) + 4, 2, 60.0f, 1.0f); |
} |
TEST(AudioBufferQueueTest, ReadS16Planar) { |
@@ -278,12 +293,16 @@ |
kSampleFormatPlanarS16, channel_layout, 100, 5, 20)); |
EXPECT_EQ(24, buffer.frames()); |
- // Read 6 frames from the buffer. |
+ // Read 6 frames from the buffer. Data is planar, so ch[0] should be |
+ // 1, 2, 3, 4, 100, 105, and ch[1] should be 5, 6, 7, 8, 200, 205. |
+ // Data is converted to float from -1.0 to 1.0 based on int16 range. |
scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); |
EXPECT_EQ(18, buffer.frames()); |
- VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint16max, 1.0f / kint16max); |
- VerifyBus(bus.get(), 4, 2, 20, 5.0f / kint16max, 1.0f / kint16max); |
+ VerifyResult(bus->channel(0), 4, 1.0f / kint16max, 1.0f / kint16max); |
+ VerifyResult(bus->channel(0) + 4, 2, 100.0f / kint16max, 5.0f / kint16max); |
+ VerifyResult(bus->channel(1), 4, 5.0f / kint16max, 1.0f / kint16max); |
+ VerifyResult(bus->channel(1) + 4, 2, 200.0f / kint16max, 5.0f / kint16max); |
} |
TEST(AudioBufferQueueTest, ReadManyChannels) { |
@@ -300,13 +319,14 @@ |
kSampleFormatF32, channel_layout, 16.0f * channels, 1.0f, 60)); |
EXPECT_EQ(76, buffer.frames()); |
- // Read 3 frames from the buffer. |
+ // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be |
+ // 1, 17, 33, and ch[1] should be 2, 18, 34. Just check a few channels. |
scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus.get())); |
EXPECT_EQ(46, buffer.frames()); |
- VerifyBus(bus.get(), 0, 6, 6, 0, 1); |
- VerifyBus(bus.get(), 6, 10, 10, 6 * channels, 1); |
- VerifyBus(bus.get(), 16, 14, 60, 16 * channels, 1); |
+ for (int i = 0; i < channels; ++i) { |
+ VerifyResult(bus->channel(i), 30, static_cast<float>(i), 8.0f); |
+ } |
} |
TEST(AudioBufferQueueTest, Peek) { |
@@ -315,32 +335,43 @@ |
AudioBufferQueue buffer; |
// Add 60 frames of data. |
- const int frames = 60; |
- buffer.Append(MakeTestBuffer<float>( |
- kSampleFormatF32, channel_layout, 0.0f, 1.0f, frames)); |
- EXPECT_EQ(frames, buffer.frames()); |
+ buffer.Append( |
+ MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 0.0f, 1.0f, 60)); |
+ EXPECT_EQ(60, buffer.frames()); |
// Peek at the first 30 frames. |
- scoped_ptr<AudioBus> bus1 = AudioBus::Create(channels, frames); |
- EXPECT_EQ(frames, buffer.frames()); |
- EXPECT_EQ(frames, buffer.PeekFrames(60, 0, 0, bus1.get())); |
+ scoped_ptr<AudioBus> bus1 = AudioBus::Create(channels, 100); |
+ EXPECT_EQ(60, buffer.frames()); |
+ EXPECT_EQ(60, buffer.PeekFrames(100, 0, 0, bus1.get())); |
EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); |
- EXPECT_EQ(frames, buffer.frames()); |
- VerifyBus(bus1.get(), 0, 30, bus1->frames(), 0, 1); |
+ EXPECT_EQ(60, buffer.frames()); |
// Now read the next 30 frames (which should be the same as those peeked at). |
- scoped_ptr<AudioBus> bus2 = AudioBus::Create(channels, frames); |
+ scoped_ptr<AudioBus> bus2 = AudioBus::Create(channels, 100); |
EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus2.get())); |
- VerifyBus(bus2.get(), 0, 30, bus2->frames(), 0, 1); |
+ for (int i = 0; i < channels; ++i) { |
+ VerifyResult(bus1->channel(i), |
+ 30, |
+ static_cast<float>(i), |
+ static_cast<float>(channels)); |
+ VerifyResult(bus2->channel(i), |
+ 30, |
+ static_cast<float>(i), |
+ static_cast<float>(channels)); |
+ } |
// Peek 10 frames forward |
- bus1->Zero(); |
EXPECT_EQ(5, buffer.PeekFrames(5, 10, 0, bus1.get())); |
- VerifyBus(bus1.get(), 0, 5, bus1->frames(), 40, 1); |
+ for (int i = 0; i < channels; ++i) { |
+ VerifyResult(bus1->channel(i), |
+ 5, |
+ static_cast<float>(i + 40 * channels), |
+ static_cast<float>(channels)); |
+ } |
// Peek to the end of the buffer. |
EXPECT_EQ(30, buffer.frames()); |
- EXPECT_EQ(30, buffer.PeekFrames(60, 0, 0, bus1.get())); |
+ EXPECT_EQ(30, buffer.PeekFrames(100, 0, 0, bus1.get())); |
EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); |
} |
@@ -349,43 +380,36 @@ |
const int channels = ChannelLayoutToChannelCount(channel_layout); |
const base::TimeDelta start_time1; |
const base::TimeDelta start_time2 = base::TimeDelta::FromSeconds(30); |
- AudioBufferQueue buffer; |
- scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
- |
- scoped_refptr<AudioBuffer> audio_buffer = |
- MakeAudioBuffer<int16>(kSampleFormatS16, |
- channel_layout, |
- channels, |
- kSampleRate, |
- 1, |
- 1, |
- 10, |
- start_time1); |
+ const base::TimeDelta duration = base::TimeDelta::FromSeconds(10); |
+ AudioBufferQueue buffer; |
+ scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
// Add two buffers (second one added later): |
// first: start=0s, duration=10s |
// second: start=30s, duration=10s |
- buffer.Append(audio_buffer); |
+ buffer.Append(MakeAudioBuffer<int16>(kSampleFormatS16, |
+ channel_layout, |
+ channels, |
+ kSampleRate, |
+ 1, |
+ 1, |
+ 10, |
+ start_time1, |
+ duration)); |
EXPECT_EQ(10, buffer.frames()); |
// Check starting time. |
EXPECT_EQ(start_time1, buffer.current_time()); |
// Read 2 frames, should be 2s in (since duration is 1s per sample). |
- int frames_read = 2; |
- EXPECT_EQ(frames_read, buffer.ReadFrames(frames_read, 0, bus.get())); |
- EXPECT_EQ( |
- start_time1 + |
- frames_read * audio_buffer->duration() / audio_buffer->frame_count(), |
- buffer.current_time()); |
+ EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); |
+ EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(2), |
+ buffer.current_time()); |
// Skip 2 frames. |
buffer.SeekFrames(2); |
- frames_read += 2; |
- EXPECT_EQ( |
- start_time1 + |
- frames_read * audio_buffer->duration() / audio_buffer->frame_count(), |
- buffer.current_time()); |
+ EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(4), |
+ buffer.current_time()); |
// Add second buffer for more data. |
buffer.Append(MakeAudioBuffer<int16>(kSampleFormatS16, |
@@ -395,32 +419,28 @@ |
1, |
1, |
10, |
- start_time2)); |
+ start_time2, |
+ duration)); |
EXPECT_EQ(16, buffer.frames()); |
// Read until almost the end of buffer1. |
- frames_read += 5; |
EXPECT_EQ(5, buffer.ReadFrames(5, 0, bus.get())); |
- EXPECT_EQ( |
- start_time1 + |
- frames_read * audio_buffer->duration() / audio_buffer->frame_count(), |
- buffer.current_time()); |
+ EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(9), |
+ buffer.current_time()); |
// Read 1 value, so time moved to buffer2. |
EXPECT_EQ(1, buffer.ReadFrames(1, 0, bus.get())); |
EXPECT_EQ(start_time2, buffer.current_time()); |
// Read all 10 frames in buffer2, timestamp should be last time from buffer2. |
- frames_read = 10; |
EXPECT_EQ(10, buffer.ReadFrames(10, 0, bus.get())); |
- const base::TimeDelta expected_current_time = |
- start_time2 + |
- frames_read * audio_buffer->duration() / audio_buffer->frame_count(); |
- EXPECT_EQ(expected_current_time, buffer.current_time()); |
+ EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10), |
+ buffer.current_time()); |
// Try to read more frames (which don't exist), timestamp should remain. |
EXPECT_EQ(0, buffer.ReadFrames(5, 0, bus.get())); |
- EXPECT_EQ(expected_current_time, buffer.current_time()); |
+ EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10), |
+ buffer.current_time()); |
} |
TEST(AudioBufferQueueTest, NoTime) { |