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