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 |