Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(688)

Side by Side Diff: media/base/audio_buffer_queue_unittest.cc

Issue 17112016: Add new class AudioBufferQueue. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/base/audio_buffer_queue.cc ('k') | media/base/audio_buffer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/stringprintf.h"
9 #include "base/time.h"
10 #include "media/base/audio_buffer.h"
11 #include "media/base/audio_buffer_queue.h"
12 #include "media/base/audio_bus.h"
13 #include "media/base/buffers.h"
14 #include "media/base/test_helpers.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace media {
18
19 static void VerifyResult(float* channel_data,
20 int frames,
21 float start,
22 float increment) {
23 for (int i = 0; i < frames; ++i) {
24 SCOPED_TRACE(base::StringPrintf(
25 "i=%d/%d start=%f, increment=%f", i, frames, start, increment));
26 ASSERT_EQ(start, channel_data[i]);
27 start += increment;
28 }
29 }
30
31 TEST(AudioBufferQueueTest, AppendAndClear) {
32 const int channels = 1;
33 const int frames = 8;
34 const base::TimeDelta start_time;
35 AudioBufferQueue buffer;
36 EXPECT_EQ(0, buffer.frames());
37 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
38 kSampleFormatU8, channels, 10, 1, frames, start_time));
39 EXPECT_EQ(frames, buffer.frames());
40 buffer.Clear();
41 EXPECT_EQ(0, buffer.frames());
42 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
43 kSampleFormatU8, channels, 20, 1, frames, start_time));
44 EXPECT_EQ(frames, buffer.frames());
45 }
46
47 TEST(AudioBufferQueueTest, MultipleAppend) {
48 const int channels = 1;
49 const base::TimeDelta start_time;
50 AudioBufferQueue buffer;
51
52 // Append 40 frames in 5 buffers.
53 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
54 kSampleFormatU8, channels, 10, 1, 8, start_time));
55 EXPECT_EQ(8, buffer.frames());
56 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
57 kSampleFormatU8, channels, 10, 1, 8, start_time));
58 EXPECT_EQ(16, buffer.frames());
59 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
60 kSampleFormatU8, channels, 10, 1, 8, start_time));
61 EXPECT_EQ(24, buffer.frames());
62 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
63 kSampleFormatU8, channels, 10, 1, 8, start_time));
64 EXPECT_EQ(32, buffer.frames());
65 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
66 kSampleFormatU8, channels, 10, 1, 8, start_time));
67 EXPECT_EQ(40, buffer.frames());
68 }
69
70 TEST(AudioBufferQueueTest, IteratorCheck) {
71 const int channels = 1;
72 const base::TimeDelta start_time;
73 AudioBufferQueue buffer;
74 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
75
76 // Append 40 frames in 5 buffers. Intersperse ReadFrames() to make the
77 // iterator is pointing to the correct position.
78 buffer.Append(MakeInterleavedAudioBuffer<float>(
79 kSampleFormatF32, channels, 10.0f, 1.0f, 8, start_time));
80 EXPECT_EQ(8, buffer.frames());
81
82 EXPECT_EQ(4, buffer.ReadFrames(4, bus.get()));
83 EXPECT_EQ(4, buffer.frames());
84 VerifyResult(bus->channel(0), 4, 10.0f, 1.0f);
85
86 buffer.Append(MakeInterleavedAudioBuffer<float>(
87 kSampleFormatF32, channels, 20.0f, 1.0f, 8, start_time));
88 EXPECT_EQ(12, buffer.frames());
89 buffer.Append(MakeInterleavedAudioBuffer<float>(
90 kSampleFormatF32, channels, 30.0f, 1.0f, 8, start_time));
91 EXPECT_EQ(20, buffer.frames());
92
93 buffer.SeekFrames(16);
94 EXPECT_EQ(4, buffer.ReadFrames(4, bus.get()));
95 EXPECT_EQ(0, buffer.frames());
96 VerifyResult(bus->channel(0), 4, 34.0f, 1.0f);
97
98 buffer.Append(MakeInterleavedAudioBuffer<float>(
99 kSampleFormatF32, channels, 40.0f, 1.0f, 8, start_time));
100 EXPECT_EQ(8, buffer.frames());
101 buffer.Append(MakeInterleavedAudioBuffer<float>(
102 kSampleFormatF32, channels, 50.0f, 1.0f, 8, start_time));
103 EXPECT_EQ(16, buffer.frames());
104
105 EXPECT_EQ(4, buffer.ReadFrames(4, bus.get()));
106 VerifyResult(bus->channel(0), 4, 40.0f, 1.0f);
107
108 // Read off the end of the buffer.
109 EXPECT_EQ(12, buffer.frames());
110 buffer.SeekFrames(8);
111 EXPECT_EQ(4, buffer.ReadFrames(100, bus.get()));
112 VerifyResult(bus->channel(0), 4, 54.0f, 1.0f);
113 }
114
115 TEST(AudioBufferQueueTest, Seek) {
116 const int channels = 2;
117 const base::TimeDelta start_time;
118 AudioBufferQueue buffer;
119
120 // Add 6 frames of data.
121 buffer.Append(MakeInterleavedAudioBuffer<float>(
122 kSampleFormatF32, channels, 1.0f, 1.0f, 6, start_time));
123 EXPECT_EQ(6, buffer.frames());
124
125 // Seek past 2 frames.
126 buffer.SeekFrames(2);
127 EXPECT_EQ(4, buffer.frames());
128
129 // Seek to end of data.
130 buffer.SeekFrames(4);
131 EXPECT_EQ(0, buffer.frames());
132
133 // At end, seek now fails unless 0 specified.
134 buffer.SeekFrames(0);
135 }
136
137 TEST(AudioBufferQueueTest, ReadF32) {
138 const int channels = 2;
139 const base::TimeDelta start_time;
140 AudioBufferQueue buffer;
141
142 // Add 76 frames of data.
143 buffer.Append(MakeInterleavedAudioBuffer<float>(
144 kSampleFormatF32, channels, 1.0f, 1.0f, 6, start_time));
145 buffer.Append(MakeInterleavedAudioBuffer<float>(
146 kSampleFormatF32, channels, 13.0f, 1.0f, 10, start_time));
147 buffer.Append(MakeInterleavedAudioBuffer<float>(
148 kSampleFormatF32, channels, 33.0f, 1.0f, 60, start_time));
149 EXPECT_EQ(76, buffer.frames());
150
151 // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be
152 // 1, 3, 5, and ch[1] should be 2, 4, 6.
153 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
154 EXPECT_EQ(3, buffer.ReadFrames(3, bus.get()));
155 EXPECT_EQ(73, buffer.frames());
156 VerifyResult(bus->channel(0), 3, 1.0f, 2.0f);
157 VerifyResult(bus->channel(1), 3, 2.0f, 2.0f);
158
159 // Now read 5 frames, which will span buffers.
160 EXPECT_EQ(5, buffer.ReadFrames(5, bus.get()));
161 EXPECT_EQ(68, buffer.frames());
162 VerifyResult(bus->channel(0), 5, 7.0f, 2.0f);
163 VerifyResult(bus->channel(1), 5, 8.0f, 2.0f);
164
165 // Now skip into the third buffer.
166 buffer.SeekFrames(20);
167 EXPECT_EQ(48, buffer.frames());
168
169 // Now read 2 frames, which are in the third buffer.
170 EXPECT_EQ(2, buffer.ReadFrames(2, bus.get()));
171 VerifyResult(bus->channel(0), 2, 57.0f, 2.0f);
172 VerifyResult(bus->channel(1), 2, 58.0f, 2.0f);
173 }
174
175 TEST(AudioBufferQueueTest, ReadU8) {
176 const int channels = 4;
177 const base::TimeDelta start_time;
178 AudioBufferQueue buffer;
179
180 // Add 4 frames of data.
181 buffer.Append(MakeInterleavedAudioBuffer<uint8>(
182 kSampleFormatU8, channels, 128, 1, 4, start_time));
183
184 // Read all 4 frames from the buffer. Data is interleaved, so ch[0] should be
185 // 128, 132, 136, 140, other channels similar. However, values are converted
186 // from [0, 255] to [-1.0, 1.0] with a bias of 128. Thus the first buffer
187 // value should be 0.0, then 1/127, 2/127, etc.
188 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
189 EXPECT_EQ(4, buffer.ReadFrames(4, bus.get()));
190 EXPECT_EQ(0, buffer.frames());
191 VerifyResult(bus->channel(0), 4, 0.0f, 4.0f / 127.0f);
192 VerifyResult(bus->channel(1), 4, 1.0f / 127.0f, 4.0f / 127.0f);
193 VerifyResult(bus->channel(2), 4, 2.0f / 127.0f, 4.0f / 127.0f);
194 VerifyResult(bus->channel(3), 4, 3.0f / 127.0f, 4.0f / 127.0f);
195 }
196
197 TEST(AudioBufferQueueTest, ReadS16) {
198 const int channels = 2;
199 const base::TimeDelta start_time;
200 AudioBufferQueue buffer;
201
202 // Add 24 frames of data.
203 buffer.Append(MakeInterleavedAudioBuffer<int16>(
204 kSampleFormatS16, channels, 1, 1, 4, start_time));
205 buffer.Append(MakeInterleavedAudioBuffer<int16>(
206 kSampleFormatS16, channels, 9, 1, 20, start_time));
207 EXPECT_EQ(24, buffer.frames());
208
209 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be
210 // 1, 3, 5, 7, 9, 11, and ch[1] should be 2, 4, 6, 8, 10, 12.
211 // Data is converted to float from -1.0 to 1.0 based on int16 range.
212 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
213 EXPECT_EQ(6, buffer.ReadFrames(6, bus.get()));
214 EXPECT_EQ(18, buffer.frames());
215 VerifyResult(bus->channel(0), 6, 1.0f / kint16max, 2.0f / kint16max);
216 VerifyResult(bus->channel(1), 6, 2.0f / kint16max, 2.0f / kint16max);
217 }
218
219 TEST(AudioBufferQueueTest, ReadS32) {
220 const int channels = 2;
221 const base::TimeDelta start_time;
222 AudioBufferQueue buffer;
223
224 // Add 24 frames of data.
225 buffer.Append(MakeInterleavedAudioBuffer<int32>(
226 kSampleFormatS32, channels, 1, 1, 4, start_time));
227 buffer.Append(MakeInterleavedAudioBuffer<int32>(
228 kSampleFormatS32, channels, 9, 1, 20, start_time));
229 EXPECT_EQ(24, buffer.frames());
230
231 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be
232 // 1, 3, 5, 7, 100, 106, and ch[1] should be 2, 4, 6, 8, 103, 109.
233 // Data is converted to float from -1.0 to 1.0 based on int32 range.
234 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
235 EXPECT_EQ(6, buffer.ReadFrames(6, bus.get()));
236 EXPECT_EQ(18, buffer.frames());
237 VerifyResult(bus->channel(0), 6, 1.0f / kint32max, 2.0f / kint32max);
238 VerifyResult(bus->channel(1), 6, 2.0f / kint32max, 2.0f / kint32max);
239
240 // Read the next 2 frames.
241 EXPECT_EQ(2, buffer.ReadFrames(2, bus.get()));
242 EXPECT_EQ(16, buffer.frames());
243 VerifyResult(bus->channel(0), 2, 13.0f / kint32max, 2.0f / kint32max);
244 VerifyResult(bus->channel(1), 2, 14.0f / kint32max, 2.0f / kint32max);
245 }
246
247 TEST(AudioBufferQueueTest, ReadF32Planar) {
248 const int channels = 2;
249 const base::TimeDelta start_time;
250 AudioBufferQueue buffer;
251
252 // Add 14 frames of data.
253 buffer.Append(MakePlanarAudioBuffer<float>(
254 kSampleFormatPlanarF32, channels, 1.0f, 1.0f, 4, start_time));
255 buffer.Append(MakePlanarAudioBuffer<float>(
256 kSampleFormatPlanarF32, channels, 50.0f, 1.0f, 10, start_time));
257 EXPECT_EQ(14, buffer.frames());
258
259 // Read 6 frames from the buffer. F32 is planar, so ch[0] should be
260 // 1, 2, 3, 4, 50, 51, and ch[1] should be 5, 6, 7, 8, 60, 61.
261 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
262 EXPECT_EQ(6, buffer.ReadFrames(6, bus.get()));
263 EXPECT_EQ(8, buffer.frames());
264 VerifyResult(bus->channel(0), 4, 1.0f, 1.0f);
265 VerifyResult(bus->channel(0) + 4, 2, 50.0f, 1.0f);
266 VerifyResult(bus->channel(1), 4, 5.0f, 1.0f);
267 VerifyResult(bus->channel(1) + 4, 2, 60.0f, 1.0f);
268 }
269
270 TEST(AudioBufferQueueTest, ReadS16Planar) {
271 const int channels = 2;
272 const base::TimeDelta start_time;
273 AudioBufferQueue buffer;
274
275 // Add 24 frames of data.
276 buffer.Append(MakePlanarAudioBuffer<int16>(
277 kSampleFormatPlanarS16, channels, 1, 1, 4, start_time));
278 buffer.Append(MakePlanarAudioBuffer<int16>(
279 kSampleFormatPlanarS16, channels, 100, 5, 20, start_time));
280 EXPECT_EQ(24, buffer.frames());
281
282 // Read 6 frames from the buffer. Data is planar, so ch[0] should be
283 // 1, 2, 3, 4, 100, 105, and ch[1] should be 5, 6, 7, 8, 200, 205.
284 // Data is converted to float from -1.0 to 1.0 based on int16 range.
285 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
286 EXPECT_EQ(6, buffer.ReadFrames(6, bus.get()));
287 EXPECT_EQ(18, buffer.frames());
288 VerifyResult(bus->channel(0), 4, 1.0f / kint16max, 1.0f / kint16max);
289 VerifyResult(bus->channel(0) + 4, 2, 100.0f / kint16max, 5.0f / kint16max);
290 VerifyResult(bus->channel(1), 4, 5.0f / kint16max, 1.0f / kint16max);
291 VerifyResult(bus->channel(1) + 4, 2, 200.0f / kint16max, 5.0f / kint16max);
292 }
293
294 TEST(AudioBufferQueueTest, ReadManyChannels) {
295 const int channels = 16;
296 const base::TimeDelta start_time;
297 AudioBufferQueue buffer;
298
299 // Add 76 frames of data.
300 buffer.Append(MakeInterleavedAudioBuffer<float>(
301 kSampleFormatF32, channels, 0.0f, 1.0f, 6, start_time));
302 buffer.Append(MakeInterleavedAudioBuffer<float>(
303 kSampleFormatF32, channels, 6.0f * channels, 1.0f, 10, start_time));
304 buffer.Append(MakeInterleavedAudioBuffer<float>(
305 kSampleFormatF32, channels, 16.0f * channels, 1.0f, 60, start_time));
306 EXPECT_EQ(76, buffer.frames());
307
308 // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be
309 // 1, 17, 33, and ch[1] should be 2, 18, 34. Just check a few channels.
310 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
311 EXPECT_EQ(30, buffer.ReadFrames(30, bus.get()));
312 EXPECT_EQ(46, buffer.frames());
313 for (int i = 0; i < channels; ++i) {
314 VerifyResult(bus->channel(i), 30, static_cast<float>(i), 16.0f);
315 }
316 }
317
318 TEST(AudioBufferQueueTest, Peek) {
319 const int channels = 4;
320 const base::TimeDelta start_time;
321 AudioBufferQueue buffer;
322
323 // Add 60 frames of data.
324 buffer.Append(MakeInterleavedAudioBuffer<float>(
325 kSampleFormatF32, channels, 0.0f, 1.0f, 60, start_time));
326 EXPECT_EQ(60, buffer.frames());
327
328 // Peek at the first 30 frames.
329 scoped_ptr<AudioBus> bus1 = AudioBus::Create(channels, 100);
330 EXPECT_EQ(60, buffer.frames());
331 EXPECT_EQ(60, buffer.PeekFrames(100, 0, bus1.get())); // only 60 in buffer.
332 EXPECT_EQ(30, buffer.PeekFrames(30, 0, bus1.get())); // should get first 30.
333 EXPECT_EQ(60, buffer.frames());
334
335 // Now read the next 30 frames (which should be the same as those peeked at).
336 scoped_ptr<AudioBus> bus2 = AudioBus::Create(channels, 100);
337 EXPECT_EQ(30, buffer.ReadFrames(30, bus2.get()));
338 for (int i = 0; i < channels; ++i) {
339 VerifyResult(bus1->channel(i),
340 30,
341 static_cast<float>(i),
342 static_cast<float>(channels));
343 VerifyResult(bus2->channel(i),
344 30,
345 static_cast<float>(i),
346 static_cast<float>(channels));
347 }
348
349 // Peek 10 frames forward
350 EXPECT_EQ(5, buffer.PeekFrames(5, 10, bus1.get()));
351 for (int i = 0; i < channels; ++i) {
352 VerifyResult(bus1->channel(i),
353 5,
354 static_cast<float>(i + 40 * channels),
355 static_cast<float>(channels));
356 }
357
358 // Peek to the end of the buffer.
359 EXPECT_EQ(30, buffer.frames());
360 EXPECT_EQ(30, buffer.PeekFrames(100, 0, bus1.get()));
361 EXPECT_EQ(30, buffer.PeekFrames(30, 0, bus1.get()));
362 }
363
364 TEST(AudioBufferQueueTest, Time) {
365 const int channels = 2;
366 const base::TimeDelta start_time1;
367 const base::TimeDelta start_time2 = base::TimeDelta::FromSeconds(30);
368 AudioBufferQueue buffer;
369 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
370
371 // Add two buffers (second one added later):
372 // first: start=0s, duration=10s
373 // second: start=30s, duration=10s
374 buffer.Append(MakeInterleavedAudioBuffer<int16>(
375 kSampleFormatS16, channels, 1, 1, 10, start_time1));
376 EXPECT_EQ(10, buffer.frames());
377
378 // Check starting time.
379 EXPECT_EQ(start_time1, buffer.current_time());
380
381 // Read 2 frames, should be 2s in (since duration is 1s per sample).
382 EXPECT_EQ(2, buffer.ReadFrames(2, bus.get()));
383 EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(2),
384 buffer.current_time());
385
386 // Skip 2 frames.
387 buffer.SeekFrames(2);
388 EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(4),
389 buffer.current_time());
390
391 // Add second buffer for more data.
392 buffer.Append(MakeInterleavedAudioBuffer<int16>(
393 kSampleFormatS16, channels, 1, 1, 10, start_time2));
394 EXPECT_EQ(16, buffer.frames());
395
396 // Read until almost the end of buffer1.
397 EXPECT_EQ(5, buffer.ReadFrames(5, bus.get()));
398 EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(9),
399 buffer.current_time());
400
401 // Read 1 value, so time moved to buffer2.
402 EXPECT_EQ(1, buffer.ReadFrames(1, bus.get()));
403 EXPECT_EQ(start_time2, buffer.current_time());
404
405 // Read all 10 frames in buffer2, timestamp should be last time from buffer2.
406 EXPECT_EQ(10, buffer.ReadFrames(10, bus.get()));
407 EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10),
408 buffer.current_time());
409
410 // Try to read more frames (which don't exist), timestamp should remain.
411 EXPECT_EQ(0, buffer.ReadFrames(5, bus.get()));
412 EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10),
413 buffer.current_time());
414 }
415
416 TEST(AudioBufferQueueTest, NoTime) {
417 const int channels = 2;
418 AudioBufferQueue buffer;
419 scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
420
421 // Add two buffers with no timestamps. Time should always be unknown.
422 buffer.Append(MakeInterleavedAudioBuffer<int16>(
423 kSampleFormatS16, channels, 1, 1, 10, kNoTimestamp()));
424 buffer.Append(MakeInterleavedAudioBuffer<int16>(
425 kSampleFormatS16, channels, 1, 1, 10, kNoTimestamp()));
426 EXPECT_EQ(20, buffer.frames());
427
428 // Check starting time.
429 EXPECT_EQ(kNoTimestamp(), buffer.current_time());
430
431 // Read 2 frames.
432 EXPECT_EQ(2, buffer.ReadFrames(2, bus.get()));
433 EXPECT_EQ(kNoTimestamp(), buffer.current_time());
434
435 // Skip 2 frames.
436 buffer.SeekFrames(2);
437 EXPECT_EQ(kNoTimestamp(), buffer.current_time());
438
439 // Read until almost the end of buffer1.
440 EXPECT_EQ(5, buffer.ReadFrames(5, bus.get()));
441 EXPECT_EQ(kNoTimestamp(), buffer.current_time());
442
443 // Read 1 value, so time moved to buffer2.
444 EXPECT_EQ(1, buffer.ReadFrames(1, bus.get()));
445 EXPECT_EQ(kNoTimestamp(), buffer.current_time());
446
447 // Read all 10 frames in buffer2.
448 EXPECT_EQ(10, buffer.ReadFrames(10, bus.get()));
449 EXPECT_EQ(kNoTimestamp(), buffer.current_time());
450
451 // Try to read more frames (which don't exist), timestamp should remain.
452 EXPECT_EQ(0, buffer.ReadFrames(5, bus.get()));
453 EXPECT_EQ(kNoTimestamp(), buffer.current_time());
454 }
455
456 } // namespace media
OLDNEW
« no previous file with comments | « media/base/audio_buffer_queue.cc ('k') | media/base/audio_buffer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698