Chromium Code Reviews| Index: media/base/audio_buffer_unittest.cc |
| diff --git a/media/base/audio_buffer_unittest.cc b/media/base/audio_buffer_unittest.cc |
| index 55ff4edcfe7dcdf6fb7bba84b5993ab848734fcd..c0fbf6b85befa1c79a3ed401363e44ced0d341bf 100644 |
| --- a/media/base/audio_buffer_unittest.cc |
| +++ b/media/base/audio_buffer_unittest.cc |
| @@ -11,16 +11,123 @@ namespace media { |
| static const int kSampleRate = 48000; |
| -static void VerifyBus(AudioBus* bus, int frames, float start, float increment) { |
| + |
| +static void VerifyBusWithOffset(AudioBus* bus, |
| + int offset, |
| + int frames, |
| + float start, |
| + float increment) { |
| for (int ch = 0; ch < bus->channels(); ++ch) { |
| const float v = start + ch * bus->frames() * increment; |
| - for (int i = 0; i < frames; ++i) { |
| + for (int i = offset; i < frames; ++i) { |
| ASSERT_FLOAT_EQ(v + i * increment, bus->channel(ch)[i]) << "i=" << i |
| << ", ch=" << ch; |
| } |
| } |
| } |
| +static void VerifyBus(AudioBus* bus, int frames, float start, float increment) { |
| + VerifyBusWithOffset(bus, 0, frames, start, increment); |
| +} |
| + |
| +static void TrimRangeTest(SampleFormat sample_format) { |
| + const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
| + const int channels = ChannelLayoutToChannelCount(channel_layout); |
| + const int frames = kSampleRate / 10; |
| + const base::TimeDelta timestamp = base::TimeDelta(); |
| + const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100); |
| + scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(sample_format, |
| + channel_layout, |
| + channels, |
| + kSampleRate, |
| + 0, |
| + 1, |
| + frames, |
| + timestamp); |
| + EXPECT_EQ(frames, buffer->frame_count()); |
| + EXPECT_EQ(timestamp, buffer->timestamp()); |
| + EXPECT_EQ(duration, buffer->duration()); |
| + |
| + scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| + |
| + // Verify all frames before trimming. |
| + buffer->ReadFrames(frames, 0, 0, bus.get()); |
| + VerifyBus(bus.get(), frames, 0, 1); |
| + |
| + // Trim 10ms of frames from the middle of the buffer. |
| + int trim_start = frames / 2; |
| + const int trim_length = kSampleRate / 100; |
| + const base::TimeDelta trim_duration = base::TimeDelta::FromMilliseconds(10); |
| + buffer->TrimRange(trim_start, trim_start + trim_length); |
| + EXPECT_EQ(frames - trim_length, buffer->frame_count()); |
| + EXPECT_EQ(timestamp, buffer->timestamp()); |
| + EXPECT_EQ(duration - trim_duration, buffer->duration()); |
| + bus->Zero(); |
| + buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| + VerifyBus(bus.get(), trim_start, 0, 1); |
| + VerifyBusWithOffset( |
| + bus.get(), trim_start, buffer->frame_count() - trim_start, 0, 1); |
|
wolenetz
2014/05/05 19:01:23
I'm not sure this is correct and how this is not f
|
| + |
| + // Trim 10ms of frames from the start, which just adjusts the buffer's |
| + // internal start offset. |
| + buffer->TrimStart(trim_length); |
| + trim_start -= trim_length; |
| + EXPECT_EQ(frames - 2 * trim_length, buffer->frame_count()); |
| + EXPECT_EQ(timestamp + trim_duration, buffer->timestamp()); |
| + EXPECT_EQ(duration - 2 * trim_duration, buffer->duration()); |
| + bus->Zero(); |
| + buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| + VerifyBus(bus.get(), trim_start, trim_length, 1); |
| + VerifyBusWithOffset( |
| + bus.get(), trim_start, buffer->frame_count() - trim_start, 0, 1); |
| + |
| + // Trim 10ms of frames from the end, which just adjusts the buffer's frame |
| + // count. |
| + buffer->TrimEnd(trim_length); |
| + EXPECT_EQ(frames - 3 * trim_length, buffer->frame_count()); |
| + EXPECT_EQ(timestamp + trim_duration, buffer->timestamp()); |
| + EXPECT_EQ(duration - 3 * trim_duration, buffer->duration()); |
| + bus->Zero(); |
| + buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| + VerifyBus(bus.get(), trim_start, trim_length, 1); |
| + VerifyBusWithOffset( |
| + bus.get(), trim_start, buffer->frame_count() - trim_start, 0, 1); |
| + |
| + // Trim another 10ms from the inner portion of the buffer. |
| + buffer->TrimRange(trim_start, trim_start + trim_length); |
| + EXPECT_EQ(frames - 4 * trim_length, buffer->frame_count()); |
| + EXPECT_EQ(timestamp + trim_duration, buffer->timestamp()); |
| + EXPECT_EQ(duration - 4 * trim_duration, buffer->duration()); |
| + bus->Zero(); |
| + buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| + VerifyBus(bus.get(), trim_start, trim_length, 1); |
| + VerifyBusWithOffset( |
| + bus.get(), trim_start, buffer->frame_count() - trim_start, 0, 1); |
| + |
| + // Trim off the end using TrimRange() to ensure end index is exclusive. |
| + buffer->TrimRange(buffer->frame_count() - trim_length, buffer->frame_count()); |
| + EXPECT_EQ(frames - 5 * trim_length, buffer->frame_count()); |
| + EXPECT_EQ(timestamp + trim_duration, buffer->timestamp()); |
| + EXPECT_EQ(duration - 5 * trim_duration, buffer->duration()); |
| + bus->Zero(); |
| + buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| + VerifyBus(bus.get(), trim_start, trim_length, 1); |
| + VerifyBusWithOffset( |
| + bus.get(), trim_start, buffer->frame_count() - trim_start, 0, 1); |
| + |
| + // Trim off the start using TrimRange() to ensure start index is inclusive. |
| + buffer->TrimRange(0, trim_length); |
| + trim_start -= trim_length; |
| + EXPECT_EQ(frames - 6 * trim_length, buffer->frame_count()); |
| + EXPECT_EQ(timestamp + trim_duration, buffer->timestamp()); |
| + EXPECT_EQ(duration - 6 * trim_duration, buffer->duration()); |
| + bus->Zero(); |
| + buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| + VerifyBus(bus.get(), trim_start, 2 * trim_length, 1); |
| + VerifyBusWithOffset( |
| + bus.get(), trim_start, buffer->frame_count() - trim_start, 0, 1); |
| +} |
| + |
| TEST(AudioBufferTest, CopyFrom) { |
| const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_MONO; |
| scoped_refptr<AudioBuffer> original_buffer = |
| @@ -312,4 +419,12 @@ TEST(AudioBufferTest, Trim) { |
| EXPECT_EQ(base::TimeDelta(), buffer->duration()); |
| } |
| +TEST(AudioBufferTest, TrimRangePlanar) { |
| + TrimRangeTest(kSampleFormatPlanarF32); |
| +} |
| + |
| +TEST(AudioBufferTest, TrimRangeInterleaved) { |
| + TrimRangeTest(kSampleFormatF32); |
| +} |
| + |
| } // namespace media |