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

Side by Side Diff: media/cast/logging/receiver_time_offset_estimator_impl_unittest.cc

Issue 236123003: Cast: Provide more meaningful stats. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor fix Created 6 years, 8 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
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 "base/memory/ref_counted.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "base/test/simple_test_tick_clock.h"
8 #include "base/time/tick_clock.h"
9 #include "media/cast/cast_environment.h"
10 #include "media/cast/logging/logging_defines.h"
11 #include "media/cast/logging/receiver_time_offset_estimator_impl.h"
12 #include "media/cast/test/fake_single_thread_task_runner.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace media {
16 namespace cast {
17
18 class ReceiverTimeOffsetEstimatorImplTest : public ::testing::Test {
19 protected:
20 ReceiverTimeOffsetEstimatorImplTest()
21 : sender_clock_(new base::SimpleTestTickClock()),
22 task_runner_(new test::FakeSingleThreadTaskRunner(sender_clock_)),
23 cast_environment_(new CastEnvironment(
24 scoped_ptr<base::TickClock>(sender_clock_).Pass(),
25 task_runner_,
26 task_runner_,
27 task_runner_)) {
28 cast_environment_->Logging()->AddRawEventSubscriber(&estimator_);
29 }
30
31 virtual ~ReceiverTimeOffsetEstimatorImplTest() {
32 cast_environment_->Logging()->RemoveRawEventSubscriber(&estimator_);
33 }
34
35 void AdvanceClocks(base::TimeDelta time) {
36 sender_clock_->Advance(time);
37 receiver_clock_.Advance(time);
38 }
39
40 base::SimpleTestTickClock* sender_clock_; // Owned by CastEnvironment.
41 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
42 scoped_refptr<CastEnvironment> cast_environment_;
43 base::SimpleTestTickClock receiver_clock_;
44 ReceiverTimeOffsetEstimatorImpl estimator_;
45 };
46
47 // Suppose the true offset is 100ms.
48 // Event A occurred at sender time 20ms.
49 // Event B occurred at receiver time 130ms. (sender time 30ms)
50 // Event C occurred at sender time 60ms.
51 // Then the bound after all 3 events have arrived is [130-60=70, 130-20=110].
52 TEST_F(ReceiverTimeOffsetEstimatorImplTest, EstimateOffset) {
53 int64 true_offset_ms = 100;
54 receiver_clock_.Advance(base::TimeDelta::FromMilliseconds(true_offset_ms));
55
56 base::TimeDelta lower_bound;
57 base::TimeDelta upper_bound;
58
59 EXPECT_FALSE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
60
61 RtpTimestamp rtp_timestamp = 0;
62 uint32 frame_id = 0;
63
64 AdvanceClocks(base::TimeDelta::FromMilliseconds(20));
65
66 cast_environment_->Logging()->InsertFrameEventWithSize(
67 sender_clock_->NowTicks(),
68 kVideoFrameEncoded,
69 rtp_timestamp,
70 frame_id,
71 1234);
72
73 EXPECT_FALSE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
74
75 AdvanceClocks(base::TimeDelta::FromMilliseconds(10));
76 cast_environment_->Logging()->InsertFrameEvent(
77 receiver_clock_.NowTicks(), kVideoAckSent, rtp_timestamp, frame_id);
78
79 EXPECT_FALSE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
80
81 AdvanceClocks(base::TimeDelta::FromMilliseconds(30));
82 cast_environment_->Logging()->InsertFrameEvent(
83 sender_clock_->NowTicks(), kVideoAckReceived, rtp_timestamp, frame_id);
84
85 EXPECT_TRUE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
86
87 int64 lower_bound_ms = lower_bound.InMilliseconds();
88 int64 upper_bound_ms = upper_bound.InMilliseconds();
89 EXPECT_EQ(70, lower_bound_ms);
90 EXPECT_EQ(110, upper_bound_ms);
91 EXPECT_GE(true_offset_ms, lower_bound_ms);
92 EXPECT_LE(true_offset_ms, upper_bound_ms);
93 }
94
95 // Same scenario as above, but event C arrives before event B. It doens't mean
96 // event C occurred before event B.
97 TEST_F(ReceiverTimeOffsetEstimatorImplTest, EventCArrivesBeforeEventB) {
98 int64 true_offset_ms = 100;
99 receiver_clock_.Advance(base::TimeDelta::FromMilliseconds(true_offset_ms));
100
101 base::TimeDelta lower_bound;
102 base::TimeDelta upper_bound;
103
104 EXPECT_FALSE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
105
106 RtpTimestamp rtp_timestamp = 0;
107 uint32 frame_id = 0;
108
109 AdvanceClocks(base::TimeDelta::FromMilliseconds(20));
110
111 cast_environment_->Logging()->InsertFrameEventWithSize(
112 sender_clock_->NowTicks(),
113 kVideoFrameEncoded,
114 rtp_timestamp,
115 frame_id,
116 1234);
117
118 EXPECT_FALSE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
119
120 AdvanceClocks(base::TimeDelta::FromMilliseconds(10));
121 base::TimeTicks event_b_time = receiver_clock_.NowTicks();
122 AdvanceClocks(base::TimeDelta::FromMilliseconds(30));
123 base::TimeTicks event_c_time = sender_clock_->NowTicks();
124
125 cast_environment_->Logging()->InsertFrameEvent(
126 event_c_time, kVideoAckReceived, rtp_timestamp, frame_id);
127
128 EXPECT_FALSE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
129
130 cast_environment_->Logging()->InsertFrameEvent(
131 event_b_time, kVideoAckSent, rtp_timestamp, frame_id);
132
133 EXPECT_TRUE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
134
135 int64 lower_bound_ms = lower_bound.InMilliseconds();
136 int64 upper_bound_ms = upper_bound.InMilliseconds();
137 EXPECT_EQ(70, lower_bound_ms);
138 EXPECT_EQ(110, upper_bound_ms);
139 EXPECT_GE(true_offset_ms, lower_bound_ms);
140 EXPECT_LE(true_offset_ms, upper_bound_ms);
141 }
142
143 TEST_F(ReceiverTimeOffsetEstimatorImplTest, MultipleIterations) {
144 int64 true_offset_ms = 100;
145 receiver_clock_.Advance(base::TimeDelta::FromMilliseconds(true_offset_ms));
146
147 base::TimeDelta lower_bound;
148 base::TimeDelta upper_bound;
149
150 RtpTimestamp rtp_timestamp_a = 0;
151 int frame_id_a = 0;
152 RtpTimestamp rtp_timestamp_b = 90;
153 int frame_id_b = 1;
154 RtpTimestamp rtp_timestamp_c = 180;
155 int frame_id_c = 2;
156
157 // Frame 1 times: [20, 30+100, 60]
158 // Frame 2 times: [30, 50+100, 55]
159 // Frame 3 times: [77, 80+100, 110]
160 // Bound should end up at [95, 103]
161 // Events times in chronological order: 20, 30 x2, 50, 55, 60, 77, 80, 110
162 AdvanceClocks(base::TimeDelta::FromMilliseconds(20));
163 cast_environment_->Logging()->InsertFrameEventWithSize(
164 sender_clock_->NowTicks(),
165 kVideoFrameEncoded,
166 rtp_timestamp_a,
167 frame_id_a,
168 1234);
169
170 AdvanceClocks(base::TimeDelta::FromMilliseconds(10));
171 cast_environment_->Logging()->InsertFrameEventWithSize(
172 sender_clock_->NowTicks(),
173 kVideoFrameEncoded,
174 rtp_timestamp_b,
175 frame_id_b,
176 1234);
177 cast_environment_->Logging()->InsertFrameEvent(
178 receiver_clock_.NowTicks(), kVideoAckSent, rtp_timestamp_a, frame_id_a);
179
180 AdvanceClocks(base::TimeDelta::FromMilliseconds(20));
181 cast_environment_->Logging()->InsertFrameEvent(
182 receiver_clock_.NowTicks(), kVideoAckSent, rtp_timestamp_b, frame_id_b);
183
184 AdvanceClocks(base::TimeDelta::FromMilliseconds(5));
185 cast_environment_->Logging()->InsertFrameEvent(sender_clock_->NowTicks(),
186 kVideoAckReceived,
187 rtp_timestamp_b,
188 frame_id_b);
189
190 AdvanceClocks(base::TimeDelta::FromMilliseconds(5));
191 cast_environment_->Logging()->InsertFrameEvent(sender_clock_->NowTicks(),
192 kVideoAckReceived,
193 rtp_timestamp_a,
194 frame_id_a);
195
196 AdvanceClocks(base::TimeDelta::FromMilliseconds(17));
197 cast_environment_->Logging()->InsertFrameEventWithSize(
198 sender_clock_->NowTicks(),
199 kVideoFrameEncoded,
200 rtp_timestamp_c,
201 frame_id_c,
202 1234);
203
204 AdvanceClocks(base::TimeDelta::FromMilliseconds(3));
205 cast_environment_->Logging()->InsertFrameEvent(
206 receiver_clock_.NowTicks(), kVideoAckSent, rtp_timestamp_c, frame_id_c);
207
208 AdvanceClocks(base::TimeDelta::FromMilliseconds(30));
209 cast_environment_->Logging()->InsertFrameEvent(sender_clock_->NowTicks(),
210 kVideoAckReceived,
211 rtp_timestamp_c,
212 frame_id_c);
213
214 EXPECT_TRUE(estimator_.GetReceiverOffsetBounds(&lower_bound, &upper_bound));
215 int64 lower_bound_ms = lower_bound.InMilliseconds();
216 int64 upper_bound_ms = upper_bound.InMilliseconds();
217 EXPECT_EQ(95, lower_bound_ms);
218 EXPECT_EQ(103, upper_bound_ms);
219 EXPECT_GE(true_offset_ms, lower_bound_ms);
220 EXPECT_LE(true_offset_ms, upper_bound_ms);
221 }
222
223 } // namespace cast
224 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698