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 |