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

Side by Side Diff: media/base/clock_impl_unittest.cc

Issue 159517: Implemented a proper clock for audio/video synchronization. (Closed)
Patch Set: Now with convenience! Created 11 years, 4 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
« no previous file with comments | « media/base/clock_impl.cc ('k') | media/base/pipeline_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2009 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 "base/logging.h"
6 #include "media/base/clock_impl.h"
7 #include "testing/gmock/include/gmock/gmock.h"
8
9 using ::testing::DefaultValue;
10 using ::testing::InSequence;
11 using ::testing::Return;
12 using ::testing::StrictMock;
13
14 namespace {
15
16 // Provide a stream output operator so we can use EXPECT_EQ(...) with TimeDelta.
17 //
18 // TODO(scherkus): move this into the testing package.
19 std::ostream& operator<<(std::ostream& stream, const base::TimeDelta& time) {
20 return (stream << time.ToInternalValue());
21 }
22
23 } // namespace
24
25 namespace media {
26
27 class MockTimeProvider {
28 public:
29 MockTimeProvider() {
30 DCHECK(!instance_) << "Only one instance of MockTimeProvider can exist";
31 DCHECK(!DefaultValue<base::Time>::IsSet());
32 instance_ = this;
33 DefaultValue<base::Time>::Set(base::Time::FromInternalValue(0));
34 }
35
36 ~MockTimeProvider() {
37 instance_ = NULL;
38 DefaultValue<base::Time>::Clear();
39 }
40
41 MOCK_METHOD0(Now, base::Time());
42
43 static base::Time StaticNow() {
44 return instance_->Now();
45 }
46
47 private:
48 static MockTimeProvider* instance_;
49 DISALLOW_COPY_AND_ASSIGN(MockTimeProvider);
50 };
51
52 MockTimeProvider* MockTimeProvider::instance_ = NULL;
53
54 TEST(ClockTest, Created) {
55 StrictMock<MockTimeProvider> mock_time;
56 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0);
57
58 ClockImpl clock(&MockTimeProvider::StaticNow);
59 EXPECT_EQ(kExpected, clock.Elapsed());
60 }
61
62 TEST(ClockTest, Play_NormalSpeed) {
63 InSequence s;
64 StrictMock<MockTimeProvider> mock_time;
65 EXPECT_CALL(mock_time, Now())
66 .WillOnce(Return(base::Time::FromDoubleT(4)));
67 EXPECT_CALL(mock_time, Now())
68 .WillOnce(Return(base::Time::FromDoubleT(6)));
69 const base::TimeDelta kZero;
70 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2);
71
72 ClockImpl clock(&MockTimeProvider::StaticNow);
73 EXPECT_EQ(kZero, clock.Play());
74 EXPECT_EQ(kExpected, clock.Elapsed());
75 }
76
77 TEST(ClockTest, Play_DoubleSpeed) {
78 InSequence s;
79 StrictMock<MockTimeProvider> mock_time;
80 EXPECT_CALL(mock_time, Now())
81 .WillOnce(Return(base::Time::FromDoubleT(4)));
82 EXPECT_CALL(mock_time, Now())
83 .WillOnce(Return(base::Time::FromDoubleT(9)));
84 const base::TimeDelta kZero;
85 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10);
86
87 ClockImpl clock(&MockTimeProvider::StaticNow);
88 clock.SetPlaybackRate(2.0f);
89 EXPECT_EQ(kZero, clock.Play());
90 EXPECT_EQ(kExpected, clock.Elapsed());
91 }
92
93 TEST(ClockTest, Play_HalfSpeed) {
94 InSequence s;
95 StrictMock<MockTimeProvider> mock_time;
96 EXPECT_CALL(mock_time, Now())
97 .WillOnce(Return(base::Time::FromDoubleT(4)));
98 EXPECT_CALL(mock_time, Now())
99 .WillOnce(Return(base::Time::FromDoubleT(8)));
100 const base::TimeDelta kZero;
101 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2);
102
103 ClockImpl clock(&MockTimeProvider::StaticNow);
104 clock.SetPlaybackRate(0.5f);
105 EXPECT_EQ(kZero, clock.Play());
106 EXPECT_EQ(kExpected, clock.Elapsed());
107 }
108
109 TEST(ClockTest, Play_ZeroSpeed) {
110 // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8
111 // seconds at normal speed:
112 // (1.0 x 2) + (0.0 x 4) + (1.0 x 8) = 10
113 InSequence s;
114 StrictMock<MockTimeProvider> mock_time;
115 EXPECT_CALL(mock_time, Now())
116 .WillOnce(Return(base::Time::FromDoubleT(4)));
117 EXPECT_CALL(mock_time, Now())
118 .WillOnce(Return(base::Time::FromDoubleT(6)));
119 EXPECT_CALL(mock_time, Now())
120 .WillOnce(Return(base::Time::FromDoubleT(10)));
121 EXPECT_CALL(mock_time, Now())
122 .WillOnce(Return(base::Time::FromDoubleT(18)));
123 const base::TimeDelta kZero;
124 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10);
125
126 ClockImpl clock(&MockTimeProvider::StaticNow);
127 EXPECT_EQ(kZero, clock.Play());
128 clock.SetPlaybackRate(0.0f);
129 clock.SetPlaybackRate(1.0f);
130 EXPECT_EQ(kExpected, clock.Elapsed());
131 }
132
133 TEST(ClockTest, Play_MultiSpeed) {
134 // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8
135 // seconds at double speed:
136 // (0.5 x 2) + (1.0 x 4) + (2.0 x 8) = 21
137 InSequence s;
138 StrictMock<MockTimeProvider> mock_time;
139 EXPECT_CALL(mock_time, Now())
140 .WillOnce(Return(base::Time::FromDoubleT(4)));
141 EXPECT_CALL(mock_time, Now())
142 .WillOnce(Return(base::Time::FromDoubleT(6)));
143 EXPECT_CALL(mock_time, Now())
144 .WillOnce(Return(base::Time::FromDoubleT(10)));
145 EXPECT_CALL(mock_time, Now())
146 .WillOnce(Return(base::Time::FromDoubleT(18)));
147 const base::TimeDelta kZero;
148 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(21);
149
150 ClockImpl clock(&MockTimeProvider::StaticNow);
151 clock.SetPlaybackRate(0.5f);
152 EXPECT_EQ(kZero, clock.Play());
153 clock.SetPlaybackRate(1.0f);
154 clock.SetPlaybackRate(2.0f);
155 EXPECT_EQ(kExpected, clock.Elapsed());
156 }
157
158 TEST(ClockTest, Pause) {
159 InSequence s;
160 StrictMock<MockTimeProvider> mock_time;
161 EXPECT_CALL(mock_time, Now())
162 .WillOnce(Return(base::Time::FromDoubleT(4)));
163 EXPECT_CALL(mock_time, Now())
164 .WillOnce(Return(base::Time::FromDoubleT(8)));
165 EXPECT_CALL(mock_time, Now())
166 .WillOnce(Return(base::Time::FromDoubleT(12)));
167 EXPECT_CALL(mock_time, Now())
168 .WillOnce(Return(base::Time::FromDoubleT(16)));
169 const base::TimeDelta kZero;
170 const base::TimeDelta kFirstPause = base::TimeDelta::FromSeconds(4);
171 const base::TimeDelta kSecondPause = base::TimeDelta::FromSeconds(8);
172
173 ClockImpl clock(&MockTimeProvider::StaticNow);
174 EXPECT_EQ(kZero, clock.Play());
175 EXPECT_EQ(kFirstPause, clock.Pause());
176 EXPECT_EQ(kFirstPause, clock.Elapsed());
177 EXPECT_EQ(kFirstPause, clock.Play());
178 EXPECT_EQ(kSecondPause, clock.Pause());
179 EXPECT_EQ(kSecondPause, clock.Elapsed());
180 }
181
182 TEST(ClockTest, SetTime_Paused) {
183 // We'll remain paused while we set the time. The time should be simply
184 // updated without accessing the time provider.
185 InSequence s;
186 StrictMock<MockTimeProvider> mock_time;
187 const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4);
188 const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16);
189
190 ClockImpl clock(&MockTimeProvider::StaticNow);
191 clock.SetTime(kFirstTime);
192 EXPECT_EQ(kFirstTime, clock.Elapsed());
193 clock.SetTime(kSecondTime);
194 EXPECT_EQ(kSecondTime, clock.Elapsed());
195 }
196
197 TEST(ClockTest, SetTime_Playing) {
198 // We'll play for 4 seconds, then set the time to 12, then play for 4 more
199 // seconds. We'll expect a media time of 16.
200 InSequence s;
201 StrictMock<MockTimeProvider> mock_time;
202 EXPECT_CALL(mock_time, Now())
203 .WillOnce(Return(base::Time::FromDoubleT(4)));
204 EXPECT_CALL(mock_time, Now())
205 .WillOnce(Return(base::Time::FromDoubleT(8)));
206 EXPECT_CALL(mock_time, Now())
207 .WillOnce(Return(base::Time::FromDoubleT(12)));
208 const base::TimeDelta kZero;
209 const base::TimeDelta kExepected = base::TimeDelta::FromSeconds(16);
210
211 ClockImpl clock(&MockTimeProvider::StaticNow);
212 EXPECT_EQ(kZero, clock.Play());
213 clock.SetTime(base::TimeDelta::FromSeconds(12));
214 EXPECT_EQ(kExepected, clock.Elapsed());
215 }
216
217 } // namespace media
OLDNEW
« no previous file with comments | « media/base/clock_impl.cc ('k') | media/base/pipeline_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698