| 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 |