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