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/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/strings/stringprintf.h" | |
9 #include "base/time/time.h" | 8 #include "base/time/time.h" |
10 #include "media/base/audio_buffer.h" | 9 #include "media/base/audio_buffer.h" |
11 #include "media/base/audio_buffer_queue.h" | 10 #include "media/base/audio_buffer_queue.h" |
12 #include "media/base/audio_bus.h" | 11 #include "media/base/audio_bus.h" |
13 #include "media/base/buffers.h" | 12 #include "media/base/buffers.h" |
14 #include "media/base/test_helpers.h" | 13 #include "media/base/test_helpers.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
16 | 15 |
17 namespace media { | 16 namespace media { |
18 | 17 |
19 const int kSampleRate = 44100; | 18 const int kSampleRate = 44100; |
20 | 19 |
21 static void VerifyResult(float* channel_data, | 20 static void VerifyBus(AudioBus* bus, |
22 int frames, | 21 int offset, |
23 float start, | 22 int frames, |
24 float increment) { | 23 int buffer_size, |
25 for (int i = 0; i < frames; ++i) { | 24 float start, |
26 SCOPED_TRACE(base::StringPrintf( | 25 float increment) { |
27 "i=%d/%d start=%f, increment=%f", i, frames, start, increment)); | 26 for (int ch = 0; ch < bus->channels(); ++ch) { |
28 ASSERT_EQ(start, channel_data[i]); | 27 const float v = start + ch * buffer_size * increment; |
29 start += increment; | 28 for (int i = offset; i < frames; ++i) { |
| 29 ASSERT_FLOAT_EQ(v + (i - offset) * increment, bus->channel(ch)[i]) |
| 30 << "i=" << i << ", ch=" << ch; |
| 31 } |
30 } | 32 } |
31 } | 33 } |
32 | 34 |
33 template <typename T> | 35 template <typename T> |
34 static scoped_refptr<AudioBuffer> MakeTestBuffer(SampleFormat format, | 36 static scoped_refptr<AudioBuffer> MakeTestBuffer(SampleFormat format, |
35 ChannelLayout channel_layout, | 37 ChannelLayout channel_layout, |
36 T start, | 38 T start, |
37 T end, | 39 T step, |
38 int frames) { | 40 int frames) { |
39 const base::TimeDelta kNoTime = kNoTimestamp(); | |
40 return MakeAudioBuffer<T>(format, | 41 return MakeAudioBuffer<T>(format, |
41 channel_layout, | 42 channel_layout, |
42 ChannelLayoutToChannelCount(channel_layout), | 43 ChannelLayoutToChannelCount(channel_layout), |
43 kSampleRate, | 44 kSampleRate, |
44 start, | 45 start, |
45 end, | 46 step, |
46 frames, | 47 frames, |
47 kNoTime, | 48 kNoTimestamp()); |
48 kNoTime); | |
49 } | 49 } |
50 | 50 |
51 TEST(AudioBufferQueueTest, AppendAndClear) { | 51 TEST(AudioBufferQueueTest, AppendAndClear) { |
52 const ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO; | 52 const ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO; |
53 AudioBufferQueue buffer; | 53 AudioBufferQueue buffer; |
54 EXPECT_EQ(0, buffer.frames()); | 54 EXPECT_EQ(0, buffer.frames()); |
55 buffer.Append( | 55 buffer.Append( |
56 MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); | 56 MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); |
57 EXPECT_EQ(8, buffer.frames()); | 57 EXPECT_EQ(8, buffer.frames()); |
58 buffer.Clear(); | 58 buffer.Clear(); |
(...skipping 30 matching lines...) Expand all Loading... |
89 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 89 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
90 | 90 |
91 // Append 40 frames in 5 buffers. Intersperse ReadFrames() to make the | 91 // Append 40 frames in 5 buffers. Intersperse ReadFrames() to make the |
92 // iterator is pointing to the correct position. | 92 // iterator is pointing to the correct position. |
93 buffer.Append(MakeTestBuffer<float>( | 93 buffer.Append(MakeTestBuffer<float>( |
94 kSampleFormatF32, channel_layout, 10.0f, 1.0f, 8)); | 94 kSampleFormatF32, channel_layout, 10.0f, 1.0f, 8)); |
95 EXPECT_EQ(8, buffer.frames()); | 95 EXPECT_EQ(8, buffer.frames()); |
96 | 96 |
97 EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); | 97 EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); |
98 EXPECT_EQ(4, buffer.frames()); | 98 EXPECT_EQ(4, buffer.frames()); |
99 VerifyResult(bus->channel(0), 4, 10.0f, 1.0f); | 99 VerifyBus(bus.get(), 0, 4, bus->frames(), 10, 1); |
100 | 100 |
101 buffer.Append(MakeTestBuffer<float>( | 101 buffer.Append(MakeTestBuffer<float>( |
102 kSampleFormatF32, channel_layout, 20.0f, 1.0f, 8)); | 102 kSampleFormatF32, channel_layout, 20.0f, 1.0f, 8)); |
103 EXPECT_EQ(12, buffer.frames()); | 103 EXPECT_EQ(12, buffer.frames()); |
104 buffer.Append(MakeTestBuffer<float>( | 104 buffer.Append(MakeTestBuffer<float>( |
105 kSampleFormatF32, channel_layout, 30.0f, 1.0f, 8)); | 105 kSampleFormatF32, channel_layout, 30.0f, 1.0f, 8)); |
106 EXPECT_EQ(20, buffer.frames()); | 106 EXPECT_EQ(20, buffer.frames()); |
107 | 107 |
108 buffer.SeekFrames(16); | 108 buffer.SeekFrames(16); |
109 EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); | 109 EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); |
110 EXPECT_EQ(0, buffer.frames()); | 110 EXPECT_EQ(0, buffer.frames()); |
111 VerifyResult(bus->channel(0), 4, 34.0f, 1.0f); | 111 VerifyBus(bus.get(), 0, 4, bus->frames(), 34, 1); |
112 | 112 |
113 buffer.Append(MakeTestBuffer<float>( | 113 buffer.Append(MakeTestBuffer<float>( |
114 kSampleFormatF32, channel_layout, 40.0f, 1.0f, 8)); | 114 kSampleFormatF32, channel_layout, 40.0f, 1.0f, 8)); |
115 EXPECT_EQ(8, buffer.frames()); | 115 EXPECT_EQ(8, buffer.frames()); |
116 buffer.Append(MakeTestBuffer<float>( | 116 buffer.Append(MakeTestBuffer<float>( |
117 kSampleFormatF32, channel_layout, 50.0f, 1.0f, 8)); | 117 kSampleFormatF32, channel_layout, 50.0f, 1.0f, 8)); |
118 EXPECT_EQ(16, buffer.frames()); | 118 EXPECT_EQ(16, buffer.frames()); |
119 | 119 |
120 EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); | 120 EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); |
121 VerifyResult(bus->channel(0), 4, 40.0f, 1.0f); | 121 VerifyBus(bus.get(), 0, 4, bus->frames(), 40, 1); |
122 | 122 |
123 // Read off the end of the buffer. | 123 // Read off the end of the buffer. |
124 EXPECT_EQ(12, buffer.frames()); | 124 EXPECT_EQ(12, buffer.frames()); |
125 buffer.SeekFrames(8); | 125 buffer.SeekFrames(8); |
126 EXPECT_EQ(4, buffer.ReadFrames(100, 0, bus.get())); | 126 EXPECT_EQ(4, buffer.ReadFrames(100, 0, bus.get())); |
127 VerifyResult(bus->channel(0), 4, 54.0f, 1.0f); | 127 VerifyBus(bus.get(), 0, 4, bus->frames(), 54, 1); |
128 } | 128 } |
129 | 129 |
130 TEST(AudioBufferQueueTest, Seek) { | 130 TEST(AudioBufferQueueTest, Seek) { |
131 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 131 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
132 AudioBufferQueue buffer; | 132 AudioBufferQueue buffer; |
133 | 133 |
134 // Add 6 frames of data. | 134 // Add 6 frames of data. |
135 buffer.Append(MakeTestBuffer<float>( | 135 buffer.Append(MakeTestBuffer<float>( |
136 kSampleFormatF32, channel_layout, 1.0f, 1.0f, 6)); | 136 kSampleFormatF32, channel_layout, 1.0f, 1.0f, 6)); |
137 EXPECT_EQ(6, buffer.frames()); | 137 EXPECT_EQ(6, buffer.frames()); |
(...skipping 17 matching lines...) Expand all Loading... |
155 | 155 |
156 // Add 76 frames of data. | 156 // Add 76 frames of data. |
157 buffer.Append( | 157 buffer.Append( |
158 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 1.0f, 1.0f, 6)); | 158 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 1.0f, 1.0f, 6)); |
159 buffer.Append( | 159 buffer.Append( |
160 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 13.0f, 1.0f, 10)); | 160 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 13.0f, 1.0f, 10)); |
161 buffer.Append( | 161 buffer.Append( |
162 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 33.0f, 1.0f, 60)); | 162 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 33.0f, 1.0f, 60)); |
163 EXPECT_EQ(76, buffer.frames()); | 163 EXPECT_EQ(76, buffer.frames()); |
164 | 164 |
165 // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be | 165 // Read 3 frames from the buffer. |
166 // 1, 3, 5, and ch[1] should be 2, 4, 6. | |
167 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 166 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
168 EXPECT_EQ(3, buffer.ReadFrames(3, 0, bus.get())); | 167 EXPECT_EQ(3, buffer.ReadFrames(3, 0, bus.get())); |
169 EXPECT_EQ(73, buffer.frames()); | 168 EXPECT_EQ(73, buffer.frames()); |
170 VerifyResult(bus->channel(0), 3, 1.0f, 2.0f); | 169 VerifyBus(bus.get(), 0, 3, 6, 1, 1); |
171 VerifyResult(bus->channel(1), 3, 2.0f, 2.0f); | |
172 | 170 |
173 // Now read 5 frames, which will span buffers. Append the data into AudioBus. | 171 // Now read 5 frames, which will span buffers. Append the data into AudioBus. |
174 EXPECT_EQ(5, buffer.ReadFrames(5, 3, bus.get())); | 172 EXPECT_EQ(5, buffer.ReadFrames(5, 3, bus.get())); |
175 EXPECT_EQ(68, buffer.frames()); | 173 EXPECT_EQ(68, buffer.frames()); |
176 VerifyResult(bus->channel(0), 8, 1.0f, 2.0f); | 174 VerifyBus(bus.get(), 0, 6, 6, 1, 1); |
177 VerifyResult(bus->channel(1), 8, 2.0f, 2.0f); | 175 VerifyBus(bus.get(), 6, 2, 10, 13, 1); |
178 | 176 |
179 // Now skip into the third buffer. | 177 // Now skip into the third buffer. |
180 buffer.SeekFrames(20); | 178 buffer.SeekFrames(20); |
181 EXPECT_EQ(48, buffer.frames()); | 179 EXPECT_EQ(48, buffer.frames()); |
182 | 180 |
183 // Now read 2 frames, which are in the third buffer. | 181 // Now read 2 frames, which are in the third buffer. |
184 EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); | 182 EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); |
185 VerifyResult(bus->channel(0), 2, 57.0f, 2.0f); | 183 VerifyBus(bus.get(), 0, 2, 60, 45, 1); |
186 VerifyResult(bus->channel(1), 2, 58.0f, 2.0f); | |
187 } | 184 } |
188 | 185 |
189 TEST(AudioBufferQueueTest, ReadU8) { | 186 TEST(AudioBufferQueueTest, ReadU8) { |
190 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; | 187 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
191 const int channels = ChannelLayoutToChannelCount(channel_layout); | 188 const int channels = ChannelLayoutToChannelCount(channel_layout); |
| 189 const int frames = 4; |
192 AudioBufferQueue buffer; | 190 AudioBufferQueue buffer; |
193 | 191 |
194 // Add 4 frames of data. | 192 // Add 4 frames of data. |
195 buffer.Append( | 193 buffer.Append( |
196 MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 128, 1, 4)); | 194 MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 128, 1, frames)); |
197 | 195 |
198 // Read all 4 frames from the buffer. Data is interleaved, so ch[0] should be | 196 // Read all 4 frames from the buffer. |
199 // 128, 132, 136, 140, other channels similar. However, values are converted | 197 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); |
200 // from [0, 255] to [-1.0, 1.0] with a bias of 128. Thus the first buffer | 198 EXPECT_EQ(frames, buffer.ReadFrames(frames, 0, bus.get())); |
201 // value should be 0.0, then 1/127, 2/127, etc. | |
202 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | |
203 EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); | |
204 EXPECT_EQ(0, buffer.frames()); | 199 EXPECT_EQ(0, buffer.frames()); |
205 VerifyResult(bus->channel(0), 4, 0.0f, 4.0f / 127.0f); | 200 VerifyBus(bus.get(), 0, frames, bus->frames(), 0, 1.0f / 127.0f); |
206 VerifyResult(bus->channel(1), 4, 1.0f / 127.0f, 4.0f / 127.0f); | |
207 VerifyResult(bus->channel(2), 4, 2.0f / 127.0f, 4.0f / 127.0f); | |
208 VerifyResult(bus->channel(3), 4, 3.0f / 127.0f, 4.0f / 127.0f); | |
209 } | 201 } |
210 | 202 |
211 TEST(AudioBufferQueueTest, ReadS16) { | 203 TEST(AudioBufferQueueTest, ReadS16) { |
212 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 204 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
213 const int channels = ChannelLayoutToChannelCount(channel_layout); | 205 const int channels = ChannelLayoutToChannelCount(channel_layout); |
214 AudioBufferQueue buffer; | 206 AudioBufferQueue buffer; |
215 | 207 |
216 // Add 24 frames of data. | 208 // Add 24 frames of data. |
217 buffer.Append( | 209 buffer.Append( |
218 MakeTestBuffer<int16>(kSampleFormatS16, channel_layout, 1, 1, 4)); | 210 MakeTestBuffer<int16>(kSampleFormatS16, channel_layout, 1, 1, 4)); |
219 buffer.Append( | 211 buffer.Append( |
220 MakeTestBuffer<int16>(kSampleFormatS16, channel_layout, 9, 1, 20)); | 212 MakeTestBuffer<int16>(kSampleFormatS16, channel_layout, 9, 1, 20)); |
221 EXPECT_EQ(24, buffer.frames()); | 213 EXPECT_EQ(24, buffer.frames()); |
222 | 214 |
223 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be | 215 // Read 6 frames from the buffer. |
224 // 1, 3, 5, 7, 9, 11, and ch[1] should be 2, 4, 6, 8, 10, 12. | 216 const int frames = 6; |
225 // Data is converted to float from -1.0 to 1.0 based on int16 range. | 217 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, buffer.frames()); |
226 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 218 EXPECT_EQ(frames, buffer.ReadFrames(frames, 0, bus.get())); |
227 EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); | |
228 EXPECT_EQ(18, buffer.frames()); | 219 EXPECT_EQ(18, buffer.frames()); |
229 VerifyResult(bus->channel(0), 6, 1.0f / kint16max, 2.0f / kint16max); | 220 VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint16max, 1.0f / kint16max); |
230 VerifyResult(bus->channel(1), 6, 2.0f / kint16max, 2.0f / kint16max); | 221 VerifyBus(bus.get(), 4, 2, 20, 9.0f / kint16max, 1.0f / kint16max); |
231 } | 222 } |
232 | 223 |
233 TEST(AudioBufferQueueTest, ReadS32) { | 224 TEST(AudioBufferQueueTest, ReadS32) { |
234 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 225 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
235 const int channels = ChannelLayoutToChannelCount(channel_layout); | 226 const int channels = ChannelLayoutToChannelCount(channel_layout); |
236 AudioBufferQueue buffer; | 227 AudioBufferQueue buffer; |
237 | 228 |
238 // Add 24 frames of data. | 229 // Add 24 frames of data. |
239 buffer.Append( | 230 buffer.Append( |
240 MakeTestBuffer<int32>(kSampleFormatS32, channel_layout, 1, 1, 4)); | 231 MakeTestBuffer<int32>(kSampleFormatS32, channel_layout, 1, 1, 4)); |
241 buffer.Append( | 232 buffer.Append( |
242 MakeTestBuffer<int32>(kSampleFormatS32, channel_layout, 9, 1, 20)); | 233 MakeTestBuffer<int32>(kSampleFormatS32, channel_layout, 9, 1, 20)); |
243 EXPECT_EQ(24, buffer.frames()); | 234 EXPECT_EQ(24, buffer.frames()); |
244 | 235 |
245 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be | 236 // Read 6 frames from the buffer. |
246 // 1, 3, 5, 7, 100, 106, and ch[1] should be 2, 4, 6, 8, 103, 109. | |
247 // Data is converted to float from -1.0 to 1.0 based on int32 range. | |
248 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 237 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
249 EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); | 238 EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); |
250 EXPECT_EQ(18, buffer.frames()); | 239 EXPECT_EQ(18, buffer.frames()); |
251 VerifyResult(bus->channel(0), 6, 1.0f / kint32max, 2.0f / kint32max); | 240 VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint32max, 1.0f / kint32max); |
252 VerifyResult(bus->channel(1), 6, 2.0f / kint32max, 2.0f / kint32max); | 241 VerifyBus(bus.get(), 4, 2, 20, 9.0f / kint32max, 1.0f / kint32max); |
253 | 242 |
254 // Read the next 2 frames. | 243 // Read the next 2 frames. |
255 EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); | 244 EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); |
256 EXPECT_EQ(16, buffer.frames()); | 245 EXPECT_EQ(16, buffer.frames()); |
257 VerifyResult(bus->channel(0), 2, 13.0f / kint32max, 2.0f / kint32max); | 246 VerifyBus(bus.get(), 0, 2, 20, 11.0f / kint32max, 1.0f / kint32max); |
258 VerifyResult(bus->channel(1), 2, 14.0f / kint32max, 2.0f / kint32max); | |
259 } | 247 } |
260 | 248 |
261 TEST(AudioBufferQueueTest, ReadF32Planar) { | 249 TEST(AudioBufferQueueTest, ReadF32Planar) { |
262 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 250 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
263 const int channels = ChannelLayoutToChannelCount(channel_layout); | 251 const int channels = ChannelLayoutToChannelCount(channel_layout); |
264 AudioBufferQueue buffer; | 252 AudioBufferQueue buffer; |
265 | 253 |
266 // Add 14 frames of data. | 254 // Add 14 frames of data. |
267 buffer.Append(MakeTestBuffer<float>( | 255 buffer.Append(MakeTestBuffer<float>( |
268 kSampleFormatPlanarF32, channel_layout, 1.0f, 1.0f, 4)); | 256 kSampleFormatPlanarF32, channel_layout, 1.0f, 1.0f, 4)); |
269 buffer.Append(MakeTestBuffer<float>( | 257 buffer.Append(MakeTestBuffer<float>( |
270 kSampleFormatPlanarF32, channel_layout, 50.0f, 1.0f, 10)); | 258 kSampleFormatPlanarF32, channel_layout, 50.0f, 1.0f, 10)); |
271 EXPECT_EQ(14, buffer.frames()); | 259 EXPECT_EQ(14, buffer.frames()); |
272 | 260 |
273 // Read 6 frames from the buffer. F32 is planar, so ch[0] should be | 261 // Read 6 frames from the buffer. |
274 // 1, 2, 3, 4, 50, 51, and ch[1] should be 5, 6, 7, 8, 60, 61. | |
275 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 262 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
276 EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); | 263 EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); |
277 EXPECT_EQ(8, buffer.frames()); | 264 EXPECT_EQ(8, buffer.frames()); |
278 VerifyResult(bus->channel(0), 4, 1.0f, 1.0f); | 265 VerifyBus(bus.get(), 0, 4, 4, 1, 1); |
279 VerifyResult(bus->channel(0) + 4, 2, 50.0f, 1.0f); | 266 VerifyBus(bus.get(), 4, 2, 10, 50, 1); |
280 VerifyResult(bus->channel(1), 4, 5.0f, 1.0f); | |
281 VerifyResult(bus->channel(1) + 4, 2, 60.0f, 1.0f); | |
282 } | 267 } |
283 | 268 |
284 TEST(AudioBufferQueueTest, ReadS16Planar) { | 269 TEST(AudioBufferQueueTest, ReadS16Planar) { |
285 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 270 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
286 const int channels = ChannelLayoutToChannelCount(channel_layout); | 271 const int channels = ChannelLayoutToChannelCount(channel_layout); |
287 AudioBufferQueue buffer; | 272 AudioBufferQueue buffer; |
288 | 273 |
289 // Add 24 frames of data. | 274 // Add 24 frames of data. |
290 buffer.Append( | 275 buffer.Append( |
291 MakeTestBuffer<int16>(kSampleFormatPlanarS16, channel_layout, 1, 1, 4)); | 276 MakeTestBuffer<int16>(kSampleFormatPlanarS16, channel_layout, 1, 1, 4)); |
292 buffer.Append(MakeTestBuffer<int16>( | 277 buffer.Append(MakeTestBuffer<int16>( |
293 kSampleFormatPlanarS16, channel_layout, 100, 5, 20)); | 278 kSampleFormatPlanarS16, channel_layout, 100, 5, 20)); |
294 EXPECT_EQ(24, buffer.frames()); | 279 EXPECT_EQ(24, buffer.frames()); |
295 | 280 |
296 // Read 6 frames from the buffer. Data is planar, so ch[0] should be | 281 // Read 6 frames from the buffer. |
297 // 1, 2, 3, 4, 100, 105, and ch[1] should be 5, 6, 7, 8, 200, 205. | |
298 // Data is converted to float from -1.0 to 1.0 based on int16 range. | |
299 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 282 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
300 EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); | 283 EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); |
301 EXPECT_EQ(18, buffer.frames()); | 284 EXPECT_EQ(18, buffer.frames()); |
302 VerifyResult(bus->channel(0), 4, 1.0f / kint16max, 1.0f / kint16max); | 285 VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint16max, 1.0f / kint16max); |
303 VerifyResult(bus->channel(0) + 4, 2, 100.0f / kint16max, 5.0f / kint16max); | 286 VerifyBus(bus.get(), 4, 2, 20, 5.0f / kint16max, 1.0f / kint16max); |
304 VerifyResult(bus->channel(1), 4, 5.0f / kint16max, 1.0f / kint16max); | |
305 VerifyResult(bus->channel(1) + 4, 2, 200.0f / kint16max, 5.0f / kint16max); | |
306 } | 287 } |
307 | 288 |
308 TEST(AudioBufferQueueTest, ReadManyChannels) { | 289 TEST(AudioBufferQueueTest, ReadManyChannels) { |
309 const ChannelLayout channel_layout = CHANNEL_LAYOUT_OCTAGONAL; | 290 const ChannelLayout channel_layout = CHANNEL_LAYOUT_OCTAGONAL; |
310 const int channels = ChannelLayoutToChannelCount(channel_layout); | 291 const int channels = ChannelLayoutToChannelCount(channel_layout); |
311 AudioBufferQueue buffer; | 292 AudioBufferQueue buffer; |
312 | 293 |
313 // Add 76 frames of data. | 294 // Add 76 frames of data. |
314 buffer.Append( | 295 buffer.Append( |
315 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 0.0f, 1.0f, 6)); | 296 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 0.0f, 1.0f, 6)); |
316 buffer.Append(MakeTestBuffer<float>( | 297 buffer.Append(MakeTestBuffer<float>( |
317 kSampleFormatF32, channel_layout, 6.0f * channels, 1.0f, 10)); | 298 kSampleFormatF32, channel_layout, 6.0f * channels, 1.0f, 10)); |
318 buffer.Append(MakeTestBuffer<float>( | 299 buffer.Append(MakeTestBuffer<float>( |
319 kSampleFormatF32, channel_layout, 16.0f * channels, 1.0f, 60)); | 300 kSampleFormatF32, channel_layout, 16.0f * channels, 1.0f, 60)); |
320 EXPECT_EQ(76, buffer.frames()); | 301 EXPECT_EQ(76, buffer.frames()); |
321 | 302 |
322 // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be | 303 // Read 3 frames from the buffer. |
323 // 1, 17, 33, and ch[1] should be 2, 18, 34. Just check a few channels. | |
324 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 304 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
325 EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus.get())); | 305 EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus.get())); |
326 EXPECT_EQ(46, buffer.frames()); | 306 EXPECT_EQ(46, buffer.frames()); |
327 for (int i = 0; i < channels; ++i) { | 307 VerifyBus(bus.get(), 0, 6, 6, 0, 1); |
328 VerifyResult(bus->channel(i), 30, static_cast<float>(i), 8.0f); | 308 VerifyBus(bus.get(), 6, 10, 10, 6 * channels, 1); |
329 } | 309 VerifyBus(bus.get(), 16, 14, 60, 16 * channels, 1); |
330 } | 310 } |
331 | 311 |
332 TEST(AudioBufferQueueTest, Peek) { | 312 TEST(AudioBufferQueueTest, Peek) { |
333 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; | 313 const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; |
334 const int channels = ChannelLayoutToChannelCount(channel_layout); | 314 const int channels = ChannelLayoutToChannelCount(channel_layout); |
335 AudioBufferQueue buffer; | 315 AudioBufferQueue buffer; |
336 | 316 |
337 // Add 60 frames of data. | 317 // Add 60 frames of data. |
338 buffer.Append( | 318 const int frames = 60; |
339 MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 0.0f, 1.0f, 60)); | 319 buffer.Append(MakeTestBuffer<float>( |
340 EXPECT_EQ(60, buffer.frames()); | 320 kSampleFormatF32, channel_layout, 0.0f, 1.0f, frames)); |
| 321 EXPECT_EQ(frames, buffer.frames()); |
341 | 322 |
342 // Peek at the first 30 frames. | 323 // Peek at the first 30 frames. |
343 scoped_ptr<AudioBus> bus1 = AudioBus::Create(channels, 100); | 324 scoped_ptr<AudioBus> bus1 = AudioBus::Create(channels, frames); |
344 EXPECT_EQ(60, buffer.frames()); | 325 EXPECT_EQ(frames, buffer.frames()); |
345 EXPECT_EQ(60, buffer.PeekFrames(100, 0, 0, bus1.get())); | 326 EXPECT_EQ(frames, buffer.PeekFrames(60, 0, 0, bus1.get())); |
346 EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); | 327 EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); |
347 EXPECT_EQ(60, buffer.frames()); | 328 EXPECT_EQ(frames, buffer.frames()); |
| 329 VerifyBus(bus1.get(), 0, 30, bus1->frames(), 0, 1); |
348 | 330 |
349 // Now read the next 30 frames (which should be the same as those peeked at). | 331 // Now read the next 30 frames (which should be the same as those peeked at). |
350 scoped_ptr<AudioBus> bus2 = AudioBus::Create(channels, 100); | 332 scoped_ptr<AudioBus> bus2 = AudioBus::Create(channels, frames); |
351 EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus2.get())); | 333 EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus2.get())); |
352 for (int i = 0; i < channels; ++i) { | 334 VerifyBus(bus2.get(), 0, 30, bus2->frames(), 0, 1); |
353 VerifyResult(bus1->channel(i), | |
354 30, | |
355 static_cast<float>(i), | |
356 static_cast<float>(channels)); | |
357 VerifyResult(bus2->channel(i), | |
358 30, | |
359 static_cast<float>(i), | |
360 static_cast<float>(channels)); | |
361 } | |
362 | 335 |
363 // Peek 10 frames forward | 336 // Peek 10 frames forward |
| 337 bus1->Zero(); |
364 EXPECT_EQ(5, buffer.PeekFrames(5, 10, 0, bus1.get())); | 338 EXPECT_EQ(5, buffer.PeekFrames(5, 10, 0, bus1.get())); |
365 for (int i = 0; i < channels; ++i) { | 339 VerifyBus(bus1.get(), 0, 5, bus1->frames(), 40, 1); |
366 VerifyResult(bus1->channel(i), | |
367 5, | |
368 static_cast<float>(i + 40 * channels), | |
369 static_cast<float>(channels)); | |
370 } | |
371 | 340 |
372 // Peek to the end of the buffer. | 341 // Peek to the end of the buffer. |
373 EXPECT_EQ(30, buffer.frames()); | 342 EXPECT_EQ(30, buffer.frames()); |
374 EXPECT_EQ(30, buffer.PeekFrames(100, 0, 0, bus1.get())); | 343 EXPECT_EQ(30, buffer.PeekFrames(60, 0, 0, bus1.get())); |
375 EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); | 344 EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); |
376 } | 345 } |
377 | 346 |
378 TEST(AudioBufferQueueTest, Time) { | 347 TEST(AudioBufferQueueTest, Time) { |
379 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 348 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
380 const int channels = ChannelLayoutToChannelCount(channel_layout); | 349 const int channels = ChannelLayoutToChannelCount(channel_layout); |
381 const base::TimeDelta start_time1; | 350 const base::TimeDelta start_time1; |
382 const base::TimeDelta start_time2 = base::TimeDelta::FromSeconds(30); | 351 const base::TimeDelta start_time2 = base::TimeDelta::FromSeconds(30); |
383 const base::TimeDelta duration = base::TimeDelta::FromSeconds(10); | |
384 AudioBufferQueue buffer; | 352 AudioBufferQueue buffer; |
385 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 353 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
386 | 354 |
| 355 scoped_refptr<AudioBuffer> audio_buffer = |
| 356 MakeAudioBuffer<int16>(kSampleFormatS16, |
| 357 channel_layout, |
| 358 channels, |
| 359 kSampleRate, |
| 360 1, |
| 361 1, |
| 362 10, |
| 363 start_time1); |
| 364 |
387 // Add two buffers (second one added later): | 365 // Add two buffers (second one added later): |
388 // first: start=0s, duration=10s | 366 // first: start=0s, duration=10s |
389 // second: start=30s, duration=10s | 367 // second: start=30s, duration=10s |
390 buffer.Append(MakeAudioBuffer<int16>(kSampleFormatS16, | 368 buffer.Append(audio_buffer); |
391 channel_layout, | |
392 channels, | |
393 kSampleRate, | |
394 1, | |
395 1, | |
396 10, | |
397 start_time1, | |
398 duration)); | |
399 EXPECT_EQ(10, buffer.frames()); | 369 EXPECT_EQ(10, buffer.frames()); |
400 | 370 |
401 // Check starting time. | 371 // Check starting time. |
402 EXPECT_EQ(start_time1, buffer.current_time()); | 372 EXPECT_EQ(start_time1, buffer.current_time()); |
403 | 373 |
404 // Read 2 frames, should be 2s in (since duration is 1s per sample). | 374 // Read 2 frames, should be 2s in (since duration is 1s per sample). |
405 EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); | 375 int frames_read = 2; |
406 EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(2), | 376 EXPECT_EQ(frames_read, buffer.ReadFrames(frames_read, 0, bus.get())); |
407 buffer.current_time()); | 377 EXPECT_EQ( |
| 378 start_time1 + |
| 379 frames_read * audio_buffer->duration() / audio_buffer->frame_count(), |
| 380 buffer.current_time()); |
408 | 381 |
409 // Skip 2 frames. | 382 // Skip 2 frames. |
410 buffer.SeekFrames(2); | 383 buffer.SeekFrames(2); |
411 EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(4), | 384 frames_read += 2; |
412 buffer.current_time()); | 385 EXPECT_EQ( |
| 386 start_time1 + |
| 387 frames_read * audio_buffer->duration() / audio_buffer->frame_count(), |
| 388 buffer.current_time()); |
413 | 389 |
414 // Add second buffer for more data. | 390 // Add second buffer for more data. |
415 buffer.Append(MakeAudioBuffer<int16>(kSampleFormatS16, | 391 buffer.Append(MakeAudioBuffer<int16>(kSampleFormatS16, |
416 channel_layout, | 392 channel_layout, |
417 channels, | 393 channels, |
418 kSampleRate, | 394 kSampleRate, |
419 1, | 395 1, |
420 1, | 396 1, |
421 10, | 397 10, |
422 start_time2, | 398 start_time2)); |
423 duration)); | |
424 EXPECT_EQ(16, buffer.frames()); | 399 EXPECT_EQ(16, buffer.frames()); |
425 | 400 |
426 // Read until almost the end of buffer1. | 401 // Read until almost the end of buffer1. |
| 402 frames_read += 5; |
427 EXPECT_EQ(5, buffer.ReadFrames(5, 0, bus.get())); | 403 EXPECT_EQ(5, buffer.ReadFrames(5, 0, bus.get())); |
428 EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(9), | 404 EXPECT_EQ( |
429 buffer.current_time()); | 405 start_time1 + |
| 406 frames_read * audio_buffer->duration() / audio_buffer->frame_count(), |
| 407 buffer.current_time()); |
430 | 408 |
431 // Read 1 value, so time moved to buffer2. | 409 // Read 1 value, so time moved to buffer2. |
432 EXPECT_EQ(1, buffer.ReadFrames(1, 0, bus.get())); | 410 EXPECT_EQ(1, buffer.ReadFrames(1, 0, bus.get())); |
433 EXPECT_EQ(start_time2, buffer.current_time()); | 411 EXPECT_EQ(start_time2, buffer.current_time()); |
434 | 412 |
435 // Read all 10 frames in buffer2, timestamp should be last time from buffer2. | 413 // Read all 10 frames in buffer2, timestamp should be last time from buffer2. |
| 414 frames_read = 10; |
436 EXPECT_EQ(10, buffer.ReadFrames(10, 0, bus.get())); | 415 EXPECT_EQ(10, buffer.ReadFrames(10, 0, bus.get())); |
437 EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10), | 416 const base::TimeDelta expected_current_time = |
438 buffer.current_time()); | 417 start_time2 + |
| 418 frames_read * audio_buffer->duration() / audio_buffer->frame_count(); |
| 419 EXPECT_EQ(expected_current_time, buffer.current_time()); |
439 | 420 |
440 // Try to read more frames (which don't exist), timestamp should remain. | 421 // Try to read more frames (which don't exist), timestamp should remain. |
441 EXPECT_EQ(0, buffer.ReadFrames(5, 0, bus.get())); | 422 EXPECT_EQ(0, buffer.ReadFrames(5, 0, bus.get())); |
442 EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10), | 423 EXPECT_EQ(expected_current_time, buffer.current_time()); |
443 buffer.current_time()); | |
444 } | 424 } |
445 | 425 |
446 TEST(AudioBufferQueueTest, NoTime) { | 426 TEST(AudioBufferQueueTest, NoTime) { |
447 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 427 const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
448 const int channels = ChannelLayoutToChannelCount(channel_layout); | 428 const int channels = ChannelLayoutToChannelCount(channel_layout); |
449 const base::TimeDelta kNoTime = kNoTimestamp(); | 429 const base::TimeDelta kNoTime = kNoTimestamp(); |
450 AudioBufferQueue buffer; | 430 AudioBufferQueue buffer; |
451 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); | 431 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); |
452 | 432 |
453 // Add two buffers with no timestamps. Time should always be unknown. | 433 // Add two buffers with no timestamps. Time should always be unknown. |
(...skipping 25 matching lines...) Expand all Loading... |
479 // Read all 10 frames in buffer2. | 459 // Read all 10 frames in buffer2. |
480 EXPECT_EQ(10, buffer.ReadFrames(10, 0, bus.get())); | 460 EXPECT_EQ(10, buffer.ReadFrames(10, 0, bus.get())); |
481 EXPECT_EQ(kNoTime, buffer.current_time()); | 461 EXPECT_EQ(kNoTime, buffer.current_time()); |
482 | 462 |
483 // Try to read more frames (which don't exist), timestamp should remain. | 463 // Try to read more frames (which don't exist), timestamp should remain. |
484 EXPECT_EQ(0, buffer.ReadFrames(5, 0, bus.get())); | 464 EXPECT_EQ(0, buffer.ReadFrames(5, 0, bus.get())); |
485 EXPECT_EQ(kNoTime, buffer.current_time()); | 465 EXPECT_EQ(kNoTime, buffer.current_time()); |
486 } | 466 } |
487 | 467 |
488 } // namespace media | 468 } // namespace media |
OLD | NEW |