| 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) {
|
|
|