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