diff options
Diffstat (limited to 'media/base/audio_buffer_queue_unittest.cc')
-rw-r--r-- | media/base/audio_buffer_queue_unittest.cc | 216 |
1 files changed, 118 insertions, 98 deletions
diff --git a/media/base/audio_buffer_queue_unittest.cc b/media/base/audio_buffer_queue_unittest.cc index e6a148a..fc04857 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 @@ namespace media { 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 @@ template <typename T> 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 @@ TEST(AudioBufferQueueTest, IteratorCheck) { 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 @@ TEST(AudioBufferQueueTest, IteratorCheck) { 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 @@ TEST(AudioBufferQueueTest, IteratorCheck) { 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 @@ TEST(AudioBufferQueueTest, ReadF32) { 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 @@ TEST(AudioBufferQueueTest, ReadF32) { // 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)); + MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 128, 1, 4)); - // Read all 4 frames from the buffer. - scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); - EXPECT_EQ(frames, buffer.ReadFrames(frames, 0, bus.get())); + // 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 @@ TEST(AudioBufferQueueTest, ReadS16) { 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 @@ TEST(AudioBufferQueueTest, ReadS32) { 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 @@ TEST(AudioBufferQueueTest, ReadF32Planar) { 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 @@ TEST(AudioBufferQueueTest, ReadS16Planar) { 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 @@ TEST(AudioBufferQueueTest, ReadManyChannels) { 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 @@ TEST(AudioBufferQueueTest, Peek) { 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 @@ TEST(AudioBufferQueueTest, Time) { const int channels = ChannelLayoutToChannelCount(channel_layout); const base::TimeDelta start_time1; const base::TimeDelta start_time2 = base::TimeDelta::FromSeconds(30); + const base::TimeDelta duration = base::TimeDelta::FromSeconds(10); 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); - // 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 @@ TEST(AudioBufferQueueTest, Time) { 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) { |