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

Side by Side Diff: media/filters/audio_clock_unittest.cc

Issue 256163005: Introduce AudioClock to improve playback delay calculations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: AudioClock Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698