Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "media/base/audio_timestamp_helper.h" | |
| 6 #include "media/base/buffers.h" | |
| 7 #include "media/filters/audio_clock.h" | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | |
| 9 | |
| 10 namespace media { | |
| 11 | |
| 12 class AudioClockTest : public testing::Test { | |
| 13 public: | |
| 14 AudioClockTest() | |
| 15 : sample_rate_(10), | |
| 16 timestamp_helper_(sample_rate_), | |
| 17 clock_(sample_rate_) { | |
| 18 timestamp_helper_.SetBaseTimestamp(base::TimeDelta()); | |
| 19 } | |
| 20 | |
| 21 virtual ~AudioClockTest() {} | |
| 22 | |
| 23 void WroteAudio(int frames, int delay_frames, float playback_rate) { | |
| 24 timestamp_helper_.AddFrames(static_cast<int>(frames * playback_rate)); | |
| 25 clock_.WroteAudio( | |
| 26 frames, delay_frames, playback_rate, timestamp_helper_.GetTimestamp()); | |
| 27 } | |
| 28 | |
| 29 void WroteSilence(int frames, int delay_frames) { | |
| 30 clock_.WroteSilence(frames, delay_frames); | |
| 31 } | |
| 32 | |
| 33 int CurrentMediaTimestampInMilliseconds() { | |
| 34 return clock_.CurrentMediaTimestamp().InMilliseconds(); | |
| 35 } | |
| 36 | |
| 37 int LastEndpointTimestampInMilliseconds() { | |
| 38 return clock_.LastEndpointTimestamp().InMilliseconds(); | |
| 39 } | |
| 40 | |
| 41 const int sample_rate_; | |
| 42 AudioTimestampHelper timestamp_helper_; | |
| 43 AudioClock clock_; | |
| 44 | |
| 45 private: | |
| 46 DISALLOW_COPY_AND_ASSIGN(AudioClockTest); | |
| 47 }; | |
| 48 | |
| 49 TEST_F(AudioClockTest, TimestampsStartAtNoTimestamp) { | |
| 50 EXPECT_EQ(kNoTimestamp(), clock_.CurrentMediaTimestamp()); | |
| 51 EXPECT_EQ(kNoTimestamp(), clock_.LastEndpointTimestamp()); | |
| 52 } | |
| 53 | |
| 54 TEST_F(AudioClockTest, Playback) { | |
| 55 // The first time we write data we should expect a negative time matching the | |
| 56 // current delay. | |
| 57 WroteAudio(10, 20, 1.0); | |
| 58 EXPECT_EQ(-2000, CurrentMediaTimestampInMilliseconds()); | |
| 59 EXPECT_EQ(1000, LastEndpointTimestampInMilliseconds()); | |
| 60 | |
| 61 // The media time should keep advancing as we write data. | |
| 62 WroteAudio(10, 20, 1.0); | |
| 63 EXPECT_EQ(-1000, CurrentMediaTimestampInMilliseconds()); | |
| 64 EXPECT_EQ(2000, LastEndpointTimestampInMilliseconds()); | |
| 65 | |
| 66 WroteAudio(10, 20, 1.0); | |
| 67 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | |
| 68 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | |
| 69 | |
| 70 WroteAudio(10, 20, 1.0); | |
| 71 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); | |
| 72 EXPECT_EQ(4000, LastEndpointTimestampInMilliseconds()); | |
| 73 | |
| 74 // Introduce a rate change to slow down time. Current time will keep advancing | |
| 75 // by one second until it hits the the slowed down audio. | |
|
scherkus (not reviewing)
2014/04/30 19:13:58
note to self: s/the the/the/
scherkus (not reviewing)
2014/05/02 19:26:05
Done.
| |
| 76 WroteAudio(10, 20, 0.5); | |
| 77 EXPECT_EQ(2000, CurrentMediaTimestampInMilliseconds()); | |
| 78 EXPECT_EQ(4500, LastEndpointTimestampInMilliseconds()); | |
| 79 | |
| 80 WroteAudio(10, 20, 0.5); | |
| 81 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); | |
| 82 EXPECT_EQ(5000, LastEndpointTimestampInMilliseconds()); | |
| 83 | |
| 84 WroteAudio(10, 20, 0.5); | |
| 85 EXPECT_EQ(4000, CurrentMediaTimestampInMilliseconds()); | |
| 86 EXPECT_EQ(5500, LastEndpointTimestampInMilliseconds()); | |
| 87 | |
| 88 WroteAudio(10, 20, 0.5); | |
| 89 EXPECT_EQ(4500, CurrentMediaTimestampInMilliseconds()); | |
| 90 EXPECT_EQ(6000, LastEndpointTimestampInMilliseconds()); | |
| 91 | |
| 92 // Introduce a rate change to speed up time. Current time will keep advancing | |
| 93 // by half a second until it hits the the sped up audio. | |
| 94 WroteAudio(10, 20, 2); | |
| 95 EXPECT_EQ(5000, CurrentMediaTimestampInMilliseconds()); | |
| 96 EXPECT_EQ(8000, LastEndpointTimestampInMilliseconds()); | |
| 97 | |
| 98 WroteAudio(10, 20, 2); | |
| 99 EXPECT_EQ(5500, CurrentMediaTimestampInMilliseconds()); | |
| 100 EXPECT_EQ(10000, LastEndpointTimestampInMilliseconds()); | |
| 101 | |
| 102 WroteAudio(10, 20, 2); | |
| 103 EXPECT_EQ(6000, CurrentMediaTimestampInMilliseconds()); | |
| 104 EXPECT_EQ(12000, LastEndpointTimestampInMilliseconds()); | |
| 105 | |
| 106 WroteAudio(10, 20, 2); | |
| 107 EXPECT_EQ(8000, CurrentMediaTimestampInMilliseconds()); | |
| 108 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | |
| 109 | |
| 110 // Write silence to simulate reaching end of stream. | |
| 111 WroteSilence(10, 20); | |
| 112 EXPECT_EQ(10000, CurrentMediaTimestampInMilliseconds()); | |
| 113 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | |
| 114 | |
| 115 WroteSilence(10, 20); | |
| 116 EXPECT_EQ(12000, CurrentMediaTimestampInMilliseconds()); | |
| 117 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | |
| 118 | |
| 119 WroteSilence(10, 20); | |
| 120 EXPECT_EQ(14000, CurrentMediaTimestampInMilliseconds()); | |
| 121 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | |
| 122 | |
| 123 // At this point media time should stop increasing. | |
| 124 WroteSilence(10, 20); | |
| 125 EXPECT_EQ(14000, CurrentMediaTimestampInMilliseconds()); | |
| 126 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | |
| 127 } | |
| 128 | |
| 129 TEST_F(AudioClockTest, AlternatingAudioAndSilence) { | |
| 130 // Buffer #1: [0, 1000) | |
| 131 WroteAudio(10, 20, 1.0); | |
| 132 EXPECT_EQ(-2000, CurrentMediaTimestampInMilliseconds()); | |
| 133 | |
| 134 // Buffer #2: 1000ms of silence | |
| 135 WroteSilence(10, 20); | |
| 136 EXPECT_EQ(-1000, CurrentMediaTimestampInMilliseconds()); | |
| 137 | |
| 138 // Buffer #3: [1000, 2000), buffer #1 is at front | |
| 139 WroteAudio(10, 20, 1.0); | |
| 140 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | |
| 141 | |
| 142 // Buffer #4: 1000ms of silence, time shouldn't advance | |
| 143 WroteSilence(10, 20); | |
| 144 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | |
| 145 | |
| 146 // Buffer #5: [2000, 3000), buffer #3 is at front | |
| 147 WroteAudio(10, 20, 1.0); | |
| 148 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); | |
| 149 } | |
| 150 | |
| 151 TEST_F(AudioClockTest, ZeroDelay) { | |
| 152 // The first time we write data we should expect the first timestamp | |
| 153 // immediately. | |
| 154 WroteAudio(10, 0, 1.0); | |
| 155 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | |
| 156 EXPECT_EQ(1000, LastEndpointTimestampInMilliseconds()); | |
| 157 | |
| 158 // Ditto for all subsequent buffers. | |
| 159 WroteAudio(10, 0, 1.0); | |
| 160 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); | |
| 161 EXPECT_EQ(2000, LastEndpointTimestampInMilliseconds()); | |
| 162 | |
| 163 WroteAudio(10, 0, 1.0); | |
| 164 EXPECT_EQ(2000, CurrentMediaTimestampInMilliseconds()); | |
| 165 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | |
| 166 | |
| 167 // Ditto for silence. | |
| 168 WroteSilence(10, 0); | |
| 169 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); | |
| 170 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | |
| 171 | |
| 172 WroteSilence(10, 0); | |
| 173 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); | |
| 174 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | |
| 175 } | |
| 176 | |
| 177 } // namespace media | |
| OLD | NEW |