| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/strings/string_util.h" | |
| 6 #include "base/strings/stringprintf.h" | |
| 7 #include "media/base/audio_buffer.h" | 5 #include "media/base/audio_buffer.h" |
| 8 #include "media/base/audio_bus.h" | 6 #include "media/base/audio_bus.h" |
| 9 #include "media/base/test_helpers.h" | 7 #include "media/base/test_helpers.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 9 |
| 12 namespace media { | 10 namespace media { |
| 13 | 11 |
| 14 const static int kSampleRate = 44100; | 12 static const int kSampleRate = 48000; |
| 15 | 13 |
| 16 static void VerifyResult(float* channel_data, | 14 static void VerifyBus(AudioBus* bus, int frames, float start, float increment) { |
| 17 int frames, | 15 for (int ch = 0; ch < bus->channels(); ++ch) { |
| 18 float start, | 16 const float v = start + ch * bus->frames() * increment; |
| 19 float increment) { | 17 for (int i = 0; i < frames; ++i) { |
| 20 for (int i = 0; i < frames; ++i) { | 18 ASSERT_FLOAT_EQ(v + i * increment, bus->channel(ch)[i]) << "i=" << i |
| 21 SCOPED_TRACE(base::StringPrintf( | 19 << ", ch=" << ch; |
| 22 "i=%d/%d start=%f, increment=%f", i, frames, start, increment)); | 20 } |
| 23 ASSERT_EQ(channel_data[i], start); | |
| 24 start += increment; | |
| 25 } | 21 } |
| 26 } | 22 } |
| 27 | 23 |
| 28 TEST(AudioBufferTest, CopyFrom) { | 24 TEST(AudioBufferTest, CopyFrom) { |
| 29 const ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO; | 25 const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_MONO; |
| 30 const int frames = 8; | 26 scoped_refptr<AudioBuffer> original_buffer = |
| 31 const base::TimeDelta start_time; | |
| 32 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 33 scoped_refptr<AudioBuffer> buffer = | |
| 34 MakeAudioBuffer<uint8>(kSampleFormatU8, | 27 MakeAudioBuffer<uint8>(kSampleFormatU8, |
| 35 channel_layout, | 28 kChannelLayout, |
| 36 ChannelLayoutToChannelCount(channel_layout), | 29 ChannelLayoutToChannelCount(kChannelLayout), |
| 37 kSampleRate, | 30 kSampleRate, |
| 38 1, | 31 1, |
| 39 1, | 32 1, |
| 40 frames, | 33 kSampleRate / 100, |
| 41 start_time, | 34 base::TimeDelta()); |
| 42 duration); | 35 scoped_refptr<AudioBuffer> new_buffer = |
| 43 EXPECT_EQ(frames, buffer->frame_count()); | 36 AudioBuffer::CopyFrom(kSampleFormatU8, |
| 44 EXPECT_EQ(buffer->timestamp(), start_time); | 37 original_buffer->channel_layout(), |
| 45 EXPECT_EQ(buffer->duration().InSeconds(), frames); | 38 original_buffer->channel_count(), |
| 46 EXPECT_FALSE(buffer->end_of_stream()); | 39 original_buffer->sample_rate(), |
| 40 original_buffer->frame_count(), |
| 41 &original_buffer->channel_data()[0], |
| 42 original_buffer->timestamp()); |
| 43 EXPECT_EQ(original_buffer->frame_count(), new_buffer->frame_count()); |
| 44 EXPECT_EQ(original_buffer->timestamp(), new_buffer->timestamp()); |
| 45 EXPECT_EQ(original_buffer->duration(), new_buffer->duration()); |
| 46 EXPECT_EQ(original_buffer->sample_rate(), new_buffer->sample_rate()); |
| 47 EXPECT_EQ(original_buffer->channel_count(), new_buffer->channel_count()); |
| 48 EXPECT_EQ(original_buffer->channel_layout(), new_buffer->channel_layout()); |
| 49 EXPECT_FALSE(original_buffer->end_of_stream()); |
| 47 } | 50 } |
| 48 | 51 |
| 49 TEST(AudioBufferTest, CreateEOSBuffer) { | 52 TEST(AudioBufferTest, CreateEOSBuffer) { |
| 50 scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEOSBuffer(); | 53 scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEOSBuffer(); |
| 51 EXPECT_TRUE(buffer->end_of_stream()); | 54 EXPECT_TRUE(buffer->end_of_stream()); |
| 52 } | 55 } |
| 53 | 56 |
| 54 TEST(AudioBufferTest, FrameSize) { | 57 TEST(AudioBufferTest, FrameSize) { |
| 55 const uint8 kTestData[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, | 58 const uint8 kTestData[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, |
| 56 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, | 59 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, |
| 57 27, 28, 29, 30, 31 }; | 60 27, 28, 29, 30, 31 }; |
| 58 const base::TimeDelta kTimestampA = base::TimeDelta::FromMicroseconds(1337); | 61 const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); |
| 59 const base::TimeDelta kTimestampB = base::TimeDelta::FromMicroseconds(1234); | |
| 60 | 62 |
| 61 const uint8* const data[] = { kTestData }; | 63 const uint8* const data[] = { kTestData }; |
| 62 scoped_refptr<AudioBuffer> buffer = | 64 scoped_refptr<AudioBuffer> buffer = |
| 63 AudioBuffer::CopyFrom(kSampleFormatU8, | 65 AudioBuffer::CopyFrom(kSampleFormatU8, |
| 64 CHANNEL_LAYOUT_STEREO, | 66 CHANNEL_LAYOUT_STEREO, |
| 65 2, | 67 2, |
| 66 kSampleRate, | 68 kSampleRate, |
| 67 16, | 69 16, |
| 68 data, | 70 data, |
| 69 kTimestampA, | 71 kTimestamp); |
| 70 kTimestampB); | |
| 71 EXPECT_EQ(16, buffer->frame_count()); // 2 channels of 8-bit data | 72 EXPECT_EQ(16, buffer->frame_count()); // 2 channels of 8-bit data |
| 72 | 73 |
| 73 buffer = AudioBuffer::CopyFrom(kSampleFormatF32, | 74 buffer = AudioBuffer::CopyFrom(kSampleFormatF32, |
| 74 CHANNEL_LAYOUT_4_0, | 75 CHANNEL_LAYOUT_4_0, |
| 75 4, | 76 4, |
| 76 kSampleRate, | 77 kSampleRate, |
| 77 2, | 78 2, |
| 78 data, | 79 data, |
| 79 kTimestampA, | 80 kTimestamp); |
| 80 kTimestampB); | |
| 81 EXPECT_EQ(2, buffer->frame_count()); // now 4 channels of 32-bit data | 81 EXPECT_EQ(2, buffer->frame_count()); // now 4 channels of 32-bit data |
| 82 } | 82 } |
| 83 | 83 |
| 84 TEST(AudioBufferTest, ReadU8) { | 84 TEST(AudioBufferTest, ReadU8) { |
| 85 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; | 85 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
| 86 const int channels = ChannelLayoutToChannelCount(channel_layout); | 86 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 87 const int frames = 4; | 87 const int frames = 10; |
| 88 const base::TimeDelta start_time; | 88 const base::TimeDelta start_time; |
| 89 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 90 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<uint8>(kSampleFormatU8, | 89 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<uint8>(kSampleFormatU8, |
| 91 channel_layout, | 90 channel_layout, |
| 92 channels, | 91 channels, |
| 93 kSampleRate, | 92 kSampleRate, |
| 94 128, | 93 128, |
| 95 1, | 94 1, |
| 96 frames, | 95 frames, |
| 97 start_time, | 96 start_time); |
| 98 duration); | 97 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| 98 buffer->ReadFrames(frames, 0, 0, bus.get()); |
| 99 VerifyBus(bus.get(), frames, 0, 1.0f / 127.0f); |
| 99 | 100 |
| 100 // Read all 4 frames from the buffer. Data is interleaved, so ch[0] should be | 101 // Now read the same data one frame at a time. |
| 101 // 128, 132, 136, 140, other channels similar. However, values are converted | 102 bus->Zero(); |
| 102 // from [0, 255] to [-1.0, 1.0] with a bias of 128. Thus the first buffer | 103 for (int i = 0; i < frames; ++i) |
| 103 // value should be 0.0, then 1/127, 2/127, etc. | 104 buffer->ReadFrames(1, i, i, bus.get()); |
| 104 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 105 VerifyBus(bus.get(), frames, 0, 1.0f / 127.0f); |
| 105 buffer->ReadFrames(frames, 0, 0, bus.get()); | |
| 106 VerifyResult(bus->channel(0), frames, 0.0f, 4.0f / 127.0f); | |
| 107 VerifyResult(bus->channel(1), frames, 1.0f / 127.0f, 4.0f / 127.0f); | |
| 108 VerifyResult(bus->channel(2), frames, 2.0f / 127.0f, 4.0f / 127.0f); | |
| 109 VerifyResult(bus->channel(3), frames, 3.0f / 127.0f, 4.0f / 127.0f); | |
| 110 } | 106 } |
| 111 | 107 |
| 112 TEST(AudioBufferTest, ReadS16) { | 108 TEST(AudioBufferTest, ReadS16) { |
| 113 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 109 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
| 114 const int channels = ChannelLayoutToChannelCount(channel_layout); | 110 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 115 const int frames = 10; | 111 const int frames = 10; |
| 116 const base::TimeDelta start_time; | 112 const base::TimeDelta start_time; |
| 117 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 118 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int16>(kSampleFormatS16, | 113 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int16>(kSampleFormatS16, |
| 119 channel_layout, | 114 channel_layout, |
| 120 channels, | 115 channels, |
| 121 kSampleRate, | 116 kSampleRate, |
| 122 1, | 117 1, |
| 123 1, | 118 1, |
| 124 frames, | 119 frames, |
| 125 start_time, | 120 start_time); |
| 126 duration); | 121 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| 127 | 122 buffer->ReadFrames(frames, 0, 0, bus.get()); |
| 128 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be 1, | 123 VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max); |
| 129 // 3, 5, 7, 9, 11, and ch[1] should be 2, 4, 6, 8, 10, 12. Data is converted | |
| 130 // to float from -1.0 to 1.0 based on int16 range. | |
| 131 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | |
| 132 buffer->ReadFrames(6, 0, 0, bus.get()); | |
| 133 VerifyResult(bus->channel(0), 6, 1.0f / kint16max, 2.0f / kint16max); | |
| 134 VerifyResult(bus->channel(1), 6, 2.0f / kint16max, 2.0f / kint16max); | |
| 135 | 124 |
| 136 // Now read the same data one frame at a time. | 125 // Now read the same data one frame at a time. |
| 137 bus = AudioBus::Create(channels, 100); | 126 bus->Zero(); |
| 138 for (int i = 0; i < frames; ++i) { | 127 for (int i = 0; i < frames; ++i) |
| 139 buffer->ReadFrames(1, i, i, bus.get()); | 128 buffer->ReadFrames(1, i, i, bus.get()); |
| 140 } | 129 VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max); |
| 141 VerifyResult(bus->channel(0), frames, 1.0f / kint16max, 2.0f / kint16max); | |
| 142 VerifyResult(bus->channel(1), frames, 2.0f / kint16max, 2.0f / kint16max); | |
| 143 } | 130 } |
| 144 | 131 |
| 145 TEST(AudioBufferTest, ReadS32) { | 132 TEST(AudioBufferTest, ReadS32) { |
| 146 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 133 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
| 147 const int channels = ChannelLayoutToChannelCount(channel_layout); | 134 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 148 const int frames = 6; | 135 const int frames = 20; |
| 149 const base::TimeDelta start_time; | 136 const base::TimeDelta start_time; |
| 150 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 151 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int32>(kSampleFormatS32, | 137 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int32>(kSampleFormatS32, |
| 152 channel_layout, | 138 channel_layout, |
| 153 channels, | 139 channels, |
| 154 kSampleRate, | 140 kSampleRate, |
| 155 1, | 141 1, |
| 156 1, | 142 1, |
| 157 frames, | 143 frames, |
| 158 start_time, | 144 start_time); |
| 159 duration); | 145 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| 146 buffer->ReadFrames(frames, 0, 0, bus.get()); |
| 147 VerifyBus(bus.get(), frames, 1.0f / kint32max, 1.0f / kint32max); |
| 160 | 148 |
| 161 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be 1, | 149 // Read second 10 frames. |
| 162 // 3, 5, 7, 9, 11, and ch[1] should be 2, 4, 6, 8, 10, 12. Data is converted | 150 bus->Zero(); |
| 163 // to float from -1.0 to 1.0 based on int32 range. | 151 buffer->ReadFrames(10, 10, 0, bus.get()); |
| 164 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 152 VerifyBus(bus.get(), 10, 11.0f / kint32max, 1.0f / kint32max); |
| 165 buffer->ReadFrames(frames, 0, 0, bus.get()); | |
| 166 VerifyResult(bus->channel(0), frames, 1.0f / kint32max, 2.0f / kint32max); | |
| 167 VerifyResult(bus->channel(1), frames, 2.0f / kint32max, 2.0f / kint32max); | |
| 168 | |
| 169 // Now read 2 frames starting at frame offset 3. ch[0] should be 7, 9, and | |
| 170 // ch[1] should be 8, 10. | |
| 171 buffer->ReadFrames(2, 3, 0, bus.get()); | |
| 172 VerifyResult(bus->channel(0), 2, 7.0f / kint32max, 2.0f / kint32max); | |
| 173 VerifyResult(bus->channel(1), 2, 8.0f / kint32max, 2.0f / kint32max); | |
| 174 } | 153 } |
| 175 | 154 |
| 176 TEST(AudioBufferTest, ReadF32) { | 155 TEST(AudioBufferTest, ReadF32) { |
| 177 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 156 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
| 178 const int channels = ChannelLayoutToChannelCount(channel_layout); | 157 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 179 const int frames = 20; | 158 const int frames = 20; |
| 180 const base::TimeDelta start_time; | 159 const base::TimeDelta start_time; |
| 181 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 182 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(kSampleFormatF32, | 160 scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(kSampleFormatF32, |
| 183 channel_layout, | 161 channel_layout, |
| 184 channels, | 162 channels, |
| 185 kSampleRate, | 163 kSampleRate, |
| 186 1.0f, | 164 1.0f, |
| 187 1.0f, | 165 1.0f, |
| 188 frames, | 166 frames, |
| 189 start_time, | 167 start_time); |
| 190 duration); | 168 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| 191 | |
| 192 // Read first 10 frames from the buffer. F32 is interleaved, so ch[0] should | |
| 193 // be 1, 3, 5, ... and ch[1] should be 2, 4, 6, ... | |
| 194 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | |
| 195 buffer->ReadFrames(10, 0, 0, bus.get()); | 169 buffer->ReadFrames(10, 0, 0, bus.get()); |
| 196 VerifyResult(bus->channel(0), 10, 1.0f, 2.0f); | 170 VerifyBus(bus.get(), 10, 1, 1); |
| 197 VerifyResult(bus->channel(1), 10, 2.0f, 2.0f); | |
| 198 | 171 |
| 199 // Read second 10 frames. | 172 // Read second 10 frames. |
| 200 bus = AudioBus::Create(channels, 100); | 173 bus->Zero(); |
| 201 buffer->ReadFrames(10, 10, 0, bus.get()); | 174 buffer->ReadFrames(10, 10, 0, bus.get()); |
| 202 VerifyResult(bus->channel(0), 10, 21.0f, 2.0f); | 175 VerifyBus(bus.get(), 10, 11, 1); |
| 203 VerifyResult(bus->channel(1), 10, 22.0f, 2.0f); | |
| 204 } | 176 } |
| 205 | 177 |
| 206 TEST(AudioBufferTest, ReadS16Planar) { | 178 TEST(AudioBufferTest, ReadS16Planar) { |
| 207 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 179 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
| 208 const int channels = ChannelLayoutToChannelCount(channel_layout); | 180 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 209 const int frames = 20; | 181 const int frames = 20; |
| 210 const base::TimeDelta start_time; | 182 const base::TimeDelta start_time; |
| 211 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 212 scoped_refptr<AudioBuffer> buffer = | 183 scoped_refptr<AudioBuffer> buffer = |
| 213 MakeAudioBuffer<int16>(kSampleFormatPlanarS16, | 184 MakeAudioBuffer<int16>(kSampleFormatPlanarS16, |
| 214 channel_layout, | 185 channel_layout, |
| 215 channels, | 186 channels, |
| 216 kSampleRate, | 187 kSampleRate, |
| 217 1, | 188 1, |
| 218 1, | 189 1, |
| 219 frames, | 190 frames, |
| 220 start_time, | 191 start_time); |
| 221 duration); | 192 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| 222 | 193 buffer->ReadFrames(10, 0, 0, bus.get()); |
| 223 // Read 6 frames from the buffer. Data is planar, so ch[0] should be 1, 2, 3, | 194 VerifyBus(bus.get(), 10, 1.0f / kint16max, 1.0f / kint16max); |
| 224 // 4, 5, 6, and ch[1] should be 21, 22, 23, 24, 25, 26. Data is converted to | |
| 225 // float from -1.0 to 1.0 based on int16 range. | |
| 226 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | |
| 227 buffer->ReadFrames(6, 0, 0, bus.get()); | |
| 228 VerifyResult(bus->channel(0), 6, 1.0f / kint16max, 1.0f / kint16max); | |
| 229 VerifyResult(bus->channel(1), 6, 21.0f / kint16max, 1.0f / kint16max); | |
| 230 | 195 |
| 231 // Read all the frames backwards, one by one. ch[0] should be 20, 19, ... | 196 // Read all the frames backwards, one by one. ch[0] should be 20, 19, ... |
| 232 bus = AudioBus::Create(channels, 100); | 197 bus->Zero(); |
| 233 for (int i = 0; i < frames; ++i) { | 198 for (int i = frames - 1; i >= 0; --i) |
| 234 buffer->ReadFrames(1, frames - i - 1, i, bus.get()); | 199 buffer->ReadFrames(1, i, i, bus.get()); |
| 235 } | 200 VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max); |
| 236 VerifyResult(bus->channel(0), frames, 20.0f / kint16max, -1.0f / kint16max); | |
| 237 VerifyResult(bus->channel(1), frames, 40.0f / kint16max, -1.0f / kint16max); | |
| 238 | 201 |
| 239 // Read 0 frames with different offsets. Existing data in AudioBus should be | 202 // Read 0 frames with different offsets. Existing data in AudioBus should be |
| 240 // unchanged. | 203 // unchanged. |
| 241 buffer->ReadFrames(0, 0, 0, bus.get()); | 204 buffer->ReadFrames(0, 0, 0, bus.get()); |
| 205 VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max); |
| 242 buffer->ReadFrames(0, 0, 10, bus.get()); | 206 buffer->ReadFrames(0, 0, 10, bus.get()); |
| 207 VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max); |
| 243 buffer->ReadFrames(0, 10, 0, bus.get()); | 208 buffer->ReadFrames(0, 10, 0, bus.get()); |
| 244 VerifyResult(bus->channel(0), frames, 20.0f / kint16max, -1.0f / kint16max); | 209 VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max); |
| 245 VerifyResult(bus->channel(1), frames, 40.0f / kint16max, -1.0f / kint16max); | |
| 246 } | 210 } |
| 247 | 211 |
| 248 TEST(AudioBufferTest, ReadF32Planar) { | 212 TEST(AudioBufferTest, ReadF32Planar) { |
| 249 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; | 213 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
| 250 const int channels = ChannelLayoutToChannelCount(channel_layout); | 214 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 251 const int frames = 100; | 215 const int frames = 100; |
| 252 const base::TimeDelta start_time; | 216 const base::TimeDelta start_time; |
| 253 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 254 scoped_refptr<AudioBuffer> buffer = | 217 scoped_refptr<AudioBuffer> buffer = |
| 255 MakeAudioBuffer<float>(kSampleFormatPlanarF32, | 218 MakeAudioBuffer<float>(kSampleFormatPlanarF32, |
| 256 channel_layout, | 219 channel_layout, |
| 257 channels, | 220 channels, |
| 258 kSampleRate, | 221 kSampleRate, |
| 259 1.0f, | 222 1.0f, |
| 260 1.0f, | 223 1.0f, |
| 261 frames, | 224 frames, |
| 262 start_time, | 225 start_time); |
| 263 duration); | |
| 264 | 226 |
| 265 // Read all 100 frames from the buffer. F32 is planar, so ch[0] should be 1, | 227 // Read all 100 frames from the buffer. F32 is planar, so ch[0] should be 1, |
| 266 // 2, 3, 4, ..., ch[1] should be 101, 102, 103, ..., and so on for all 4 | 228 // 2, 3, 4, ..., ch[1] should be 101, 102, 103, ..., and so on for all 4 |
| 267 // channels. | 229 // channels. |
| 268 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 230 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
| 269 buffer->ReadFrames(frames, 0, 0, bus.get()); | 231 buffer->ReadFrames(frames, 0, 0, bus.get()); |
| 270 VerifyResult(bus->channel(0), frames, 1.0f, 1.0f); | 232 VerifyBus(bus.get(), frames, 1, 1); |
| 271 VerifyResult(bus->channel(1), frames, 101.0f, 1.0f); | |
| 272 VerifyResult(bus->channel(2), frames, 201.0f, 1.0f); | |
| 273 VerifyResult(bus->channel(3), frames, 301.0f, 1.0f); | |
| 274 | 233 |
| 275 // Now read 20 frames from the middle of the buffer. | 234 // Now read 20 frames from the middle of the buffer. |
| 276 bus = AudioBus::Create(channels, 100); | 235 bus->Zero(); |
| 277 buffer->ReadFrames(20, 50, 0, bus.get()); | 236 buffer->ReadFrames(20, 50, 0, bus.get()); |
| 278 VerifyResult(bus->channel(0), 20, 51.0f, 1.0f); | 237 VerifyBus(bus.get(), 20, 51, 1); |
| 279 VerifyResult(bus->channel(1), 20, 151.0f, 1.0f); | |
| 280 VerifyResult(bus->channel(2), 20, 251.0f, 1.0f); | |
| 281 VerifyResult(bus->channel(3), 20, 351.0f, 1.0f); | |
| 282 } | 238 } |
| 283 | 239 |
| 284 TEST(AudioBufferTest, EmptyBuffer) { | 240 TEST(AudioBufferTest, EmptyBuffer) { |
| 285 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; | 241 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
| 286 const int channels = ChannelLayoutToChannelCount(channel_layout); | 242 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 287 const int frames = 100; | 243 const int frames = kSampleRate / 100; |
| 288 const base::TimeDelta start_time; | 244 const base::TimeDelta start_time; |
| 289 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | |
| 290 scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEmptyBuffer( | 245 scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEmptyBuffer( |
| 291 channel_layout, channels, kSampleRate, frames, start_time, duration); | 246 channel_layout, channels, kSampleRate, frames, start_time); |
| 292 EXPECT_EQ(frames, buffer->frame_count()); | 247 EXPECT_EQ(frames, buffer->frame_count()); |
| 293 EXPECT_EQ(start_time, buffer->timestamp()); | 248 EXPECT_EQ(start_time, buffer->timestamp()); |
| 294 EXPECT_EQ(frames, buffer->duration().InSeconds()); | 249 EXPECT_EQ(base::TimeDelta::FromMilliseconds(10), buffer->duration()); |
| 295 EXPECT_FALSE(buffer->end_of_stream()); | 250 EXPECT_FALSE(buffer->end_of_stream()); |
| 296 | 251 |
| 297 // Read all 100 frames from the buffer. All data should be 0. | 252 // Read all 100 frames from the buffer. All data should be 0. |
| 298 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 253 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| 299 buffer->ReadFrames(frames, 0, 0, bus.get()); | 254 buffer->ReadFrames(frames, 0, 0, bus.get()); |
| 300 VerifyResult(bus->channel(0), frames, 0.0f, 0.0f); | 255 VerifyBus(bus.get(), frames, 0, 0); |
| 301 VerifyResult(bus->channel(1), frames, 0.0f, 0.0f); | |
| 302 VerifyResult(bus->channel(2), frames, 0.0f, 0.0f); | |
| 303 VerifyResult(bus->channel(3), frames, 0.0f, 0.0f); | |
| 304 } | 256 } |
| 305 | 257 |
| 306 TEST(AudioBufferTest, Trim) { | 258 TEST(AudioBufferTest, Trim) { |
| 307 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; | 259 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
| 308 const int channels = ChannelLayoutToChannelCount(channel_layout); | 260 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 309 const int frames = 100; | 261 const int frames = kSampleRate / 10; |
| 310 const base::TimeDelta start_time; | 262 const base::TimeDelta start_time; |
| 311 const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames); | 263 const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100); |
| 312 scoped_refptr<AudioBuffer> buffer = | 264 scoped_refptr<AudioBuffer> buffer = |
| 313 MakeAudioBuffer<float>(kSampleFormatPlanarF32, | 265 MakeAudioBuffer<float>(kSampleFormatPlanarF32, |
| 314 channel_layout, | 266 channel_layout, |
| 315 channels, | 267 channels, |
| 316 kSampleRate, | 268 kSampleRate, |
| 317 1.0f, | 269 0.0f, |
| 318 1.0f, | 270 1.0f, |
| 319 frames, | 271 frames, |
| 320 start_time, | 272 start_time); |
| 321 duration); | |
| 322 EXPECT_EQ(frames, buffer->frame_count()); | 273 EXPECT_EQ(frames, buffer->frame_count()); |
| 323 EXPECT_EQ(start_time, buffer->timestamp()); | 274 EXPECT_EQ(start_time, buffer->timestamp()); |
| 324 EXPECT_EQ(frames, buffer->duration().InSeconds()); | 275 EXPECT_EQ(duration, buffer->duration()); |
| 325 | 276 |
| 326 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 277 const int ten_ms_of_frames = kSampleRate / 100; |
| 327 buffer->ReadFrames(20, 0, 0, bus.get()); | 278 const base::TimeDelta ten_ms = base::TimeDelta::FromMilliseconds(10); |
| 328 VerifyResult(bus->channel(0), 20, 1.0f, 1.0f); | |
| 329 | 279 |
| 330 // Trim off 10 frames from the start. | 280 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
| 331 buffer->TrimStart(10); | 281 buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| 332 EXPECT_EQ(buffer->frame_count(), frames - 10); | 282 VerifyBus(bus.get(), buffer->frame_count(), 0.0f, 1.0f); |
| 333 EXPECT_EQ(buffer->timestamp(), start_time + base::TimeDelta::FromSeconds(10)); | |
| 334 EXPECT_EQ(buffer->duration(), base::TimeDelta::FromSeconds(90)); | |
| 335 buffer->ReadFrames(20, 0, 0, bus.get()); | |
| 336 VerifyResult(bus->channel(0), 20, 11.0f, 1.0f); | |
| 337 | 283 |
| 338 // Trim off 10 frames from the end. | 284 // Trim off 10ms of frames from the start. |
| 339 buffer->TrimEnd(10); | 285 buffer->TrimStart(ten_ms_of_frames); |
| 340 EXPECT_EQ(buffer->frame_count(), frames - 20); | 286 EXPECT_EQ(start_time + ten_ms, buffer->timestamp()); |
| 341 EXPECT_EQ(buffer->timestamp(), start_time + base::TimeDelta::FromSeconds(10)); | 287 EXPECT_EQ(frames - ten_ms_of_frames, buffer->frame_count()); |
| 342 EXPECT_EQ(buffer->duration(), base::TimeDelta::FromSeconds(80)); | 288 EXPECT_EQ(duration - ten_ms, buffer->duration()); |
| 343 buffer->ReadFrames(20, 0, 0, bus.get()); | 289 buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| 344 VerifyResult(bus->channel(0), 20, 11.0f, 1.0f); | 290 VerifyBus(bus.get(), buffer->frame_count(), ten_ms_of_frames, 1.0f); |
| 345 | 291 |
| 346 // Trim off 50 more from the start. | 292 // Trim off 10ms of frames from the end. |
| 347 buffer->TrimStart(50); | 293 buffer->TrimEnd(ten_ms_of_frames); |
| 348 EXPECT_EQ(buffer->frame_count(), frames - 70); | 294 EXPECT_EQ(start_time + ten_ms, buffer->timestamp()); |
| 349 EXPECT_EQ(buffer->timestamp(), start_time + base::TimeDelta::FromSeconds(60)); | 295 EXPECT_EQ(frames - 2 * ten_ms_of_frames, buffer->frame_count()); |
| 350 EXPECT_EQ(buffer->duration(), base::TimeDelta::FromSeconds(30)); | 296 EXPECT_EQ(duration - 2 * ten_ms, buffer->duration()); |
| 351 buffer->ReadFrames(10, 0, 0, bus.get()); | 297 buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| 352 VerifyResult(bus->channel(0), 10, 61.0f, 1.0f); | 298 VerifyBus(bus.get(), buffer->frame_count(), ten_ms_of_frames, 1.0f); |
| 353 | 299 |
| 354 // Trim off the last 30 frames. | 300 // Trim off 40ms more from the start. |
| 355 buffer->TrimEnd(30); | 301 buffer->TrimStart(4 * ten_ms_of_frames); |
| 356 EXPECT_EQ(buffer->frame_count(), 0); | 302 EXPECT_EQ(start_time + 5 * ten_ms, buffer->timestamp()); |
| 357 EXPECT_EQ(buffer->timestamp(), start_time + base::TimeDelta::FromSeconds(60)); | 303 EXPECT_EQ(frames - 6 * ten_ms_of_frames, buffer->frame_count()); |
| 358 EXPECT_EQ(buffer->duration(), base::TimeDelta::FromSeconds(0)); | 304 EXPECT_EQ(duration - 6 * ten_ms, buffer->duration()); |
| 305 buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); |
| 306 VerifyBus(bus.get(), buffer->frame_count(), 5 * ten_ms_of_frames, 1.0f); |
| 307 |
| 308 // Trim off the final 40ms from the end. |
| 309 buffer->TrimEnd(4 * ten_ms_of_frames); |
| 310 EXPECT_EQ(0, buffer->frame_count()); |
| 311 EXPECT_EQ(start_time + 5 * ten_ms, buffer->timestamp()); |
| 312 EXPECT_EQ(base::TimeDelta(), buffer->duration()); |
| 359 } | 313 } |
| 360 | 314 |
| 361 } // namespace media | 315 } // namespace media |
| OLD | NEW |