OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 <stdint.h> | 5 #include <stdint.h> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
10 #include "media/cast/net/cast_transport_config.h" | 10 #include "media/cast/net/cast_transport_config.h" |
11 #include "media/cast/net/pacing/paced_sender.h" | 11 #include "media/cast/net/pacing/paced_sender.h" |
12 #include "media/cast/net/rtcp/rtcp.h" | 12 #include "media/cast/net/rtcp/receiver_rtcp_session.h" |
| 13 #include "media/cast/net/rtcp/rtcp_session.h" |
13 #include "media/cast/net/rtcp/rtcp_utility.h" | 14 #include "media/cast/net/rtcp/rtcp_utility.h" |
| 15 #include "media/cast/net/rtcp/sender_rtcp_session.h" |
14 #include "media/cast/test/skewed_tick_clock.h" | 16 #include "media/cast/test/skewed_tick_clock.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 17 #include "testing/gmock/include/gmock/gmock.h" |
16 | 18 |
17 namespace media { | 19 namespace media { |
18 namespace cast { | 20 namespace cast { |
19 | 21 |
| 22 namespace { |
| 23 |
| 24 media::cast::RtcpTimeData CreateRtcpTimeData(base::TimeTicks now) { |
| 25 media::cast::RtcpTimeData ret; |
| 26 ret.timestamp = now; |
| 27 media::cast::ConvertTimeTicksToNtp(now, &ret.ntp_seconds, &ret.ntp_fraction); |
| 28 return ret; |
| 29 } |
| 30 |
| 31 } // namespace |
| 32 |
20 using testing::_; | 33 using testing::_; |
21 | 34 |
22 static const uint32 kSenderSsrc = 0x10203; | 35 static const uint32 kSenderSsrc = 0x10203; |
23 static const uint32 kReceiverSsrc = 0x40506; | 36 static const uint32 kReceiverSsrc = 0x40506; |
24 static const int kInitialReceiverClockOffsetSeconds = -5; | 37 static const int kInitialReceiverClockOffsetSeconds = -5; |
25 | 38 |
26 class FakeRtcpTransport : public PacedPacketSender { | 39 class FakeRtcpTransport : public PacedPacketSender { |
27 public: | 40 public: |
28 explicit FakeRtcpTransport(base::SimpleTestTickClock* clock) | 41 explicit FakeRtcpTransport(base::SimpleTestTickClock* clock) |
29 : clock_(clock), | 42 : clock_(clock), |
30 packet_delay_(base::TimeDelta::FromMilliseconds(42)), | 43 packet_delay_(base::TimeDelta::FromMilliseconds(42)), |
31 paused_(false) {} | 44 paused_(false) {} |
32 | 45 |
33 void set_rtcp_destination(Rtcp* rtcp) { rtcp_ = rtcp; } | 46 void set_rtcp_destination(RtcpSession* rtcp_session) { |
| 47 rtcp_session_ = rtcp_session; |
| 48 } |
34 | 49 |
35 base::TimeDelta packet_delay() const { return packet_delay_; } | 50 base::TimeDelta packet_delay() const { return packet_delay_; } |
36 void set_packet_delay(base::TimeDelta delay) { packet_delay_ = delay; } | 51 void set_packet_delay(base::TimeDelta delay) { packet_delay_ = delay; } |
37 | 52 |
38 bool SendRtcpPacket(uint32 ssrc, PacketRef packet) final { | 53 bool SendRtcpPacket(uint32 ssrc, PacketRef packet) final { |
39 clock_->Advance(packet_delay_); | 54 clock_->Advance(packet_delay_); |
40 if (paused_) { | 55 if (paused_) { |
41 packet_queue_.push_back(packet); | 56 packet_queue_.push_back(packet); |
42 } else { | 57 } else { |
43 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | 58 rtcp_session_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); |
44 } | 59 } |
45 return true; | 60 return true; |
46 } | 61 } |
47 | 62 |
48 bool SendPackets(const SendPacketVector& packets) final { return false; } | 63 bool SendPackets(const SendPacketVector& packets) final { return false; } |
49 | 64 |
50 bool ResendPackets(const SendPacketVector& packets, | 65 bool ResendPackets(const SendPacketVector& packets, |
51 const DedupInfo& dedup_info) final { | 66 const DedupInfo& dedup_info) final { |
52 return false; | 67 return false; |
53 } | 68 } |
54 | 69 |
55 void CancelSendingPacket(const PacketKey& packet_key) final {} | 70 void CancelSendingPacket(const PacketKey& packet_key) final {} |
56 | 71 |
57 void Pause() { | 72 void Pause() { |
58 paused_ = true; | 73 paused_ = true; |
59 } | 74 } |
60 | 75 |
61 void Unpause() { | 76 void Unpause() { |
62 paused_ = false; | 77 paused_ = false; |
63 for (size_t i = 0; i < packet_queue_.size(); ++i) { | 78 for (size_t i = 0; i < packet_queue_.size(); ++i) { |
64 rtcp_->IncomingRtcpPacket(&packet_queue_[i]->data[0], | 79 rtcp_session_->IncomingRtcpPacket(&packet_queue_[i]->data[0], |
65 packet_queue_[i]->data.size()); | 80 packet_queue_[i]->data.size()); |
66 } | 81 } |
67 packet_queue_.clear(); | 82 packet_queue_.clear(); |
68 } | 83 } |
69 | 84 |
70 void ReversePacketQueue() { | 85 void ReversePacketQueue() { |
71 std::reverse(packet_queue_.begin(), packet_queue_.end()); | 86 std::reverse(packet_queue_.begin(), packet_queue_.end()); |
72 } | 87 } |
73 | 88 |
74 private: | 89 private: |
75 base::SimpleTestTickClock* const clock_; | 90 base::SimpleTestTickClock* const clock_; |
76 base::TimeDelta packet_delay_; | 91 base::TimeDelta packet_delay_; |
77 Rtcp* rtcp_; | 92 RtcpSession* rtcp_session_; // RTCP destination. |
78 bool paused_; | 93 bool paused_; |
79 std::vector<PacketRef> packet_queue_; | 94 std::vector<PacketRef> packet_queue_; |
80 | 95 |
81 DISALLOW_COPY_AND_ASSIGN(FakeRtcpTransport); | 96 DISALLOW_COPY_AND_ASSIGN(FakeRtcpTransport); |
82 }; | 97 }; |
83 | 98 |
84 class MockFrameSender { | 99 class MockFrameSender { |
85 public: | 100 public: |
86 MockFrameSender() {} | 101 MockFrameSender() {} |
87 virtual ~MockFrameSender() {} | 102 virtual ~MockFrameSender() {} |
(...skipping 15 matching lines...) Expand all Loading... |
103 receiver_to_sender_(sender_clock_.get()), | 118 receiver_to_sender_(sender_clock_.get()), |
104 rtcp_for_sender_(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 119 rtcp_for_sender_(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
105 base::Unretained(&mock_frame_sender_)), | 120 base::Unretained(&mock_frame_sender_)), |
106 base::Bind(&MockFrameSender::OnMeasuredRoundTripTime, | 121 base::Bind(&MockFrameSender::OnMeasuredRoundTripTime, |
107 base::Unretained(&mock_frame_sender_)), | 122 base::Unretained(&mock_frame_sender_)), |
108 RtcpLogMessageCallback(), | 123 RtcpLogMessageCallback(), |
109 sender_clock_.get(), | 124 sender_clock_.get(), |
110 &sender_to_receiver_, | 125 &sender_to_receiver_, |
111 kSenderSsrc, | 126 kSenderSsrc, |
112 kReceiverSsrc), | 127 kReceiverSsrc), |
113 rtcp_for_receiver_(RtcpCastMessageCallback(), | 128 rtcp_for_receiver_(receiver_clock_.get(), |
114 RtcpRttCallback(), | |
115 RtcpLogMessageCallback(), | |
116 receiver_clock_.get(), | |
117 &receiver_to_sender_, | 129 &receiver_to_sender_, |
118 kReceiverSsrc, | 130 kReceiverSsrc, |
119 kSenderSsrc) { | 131 kSenderSsrc) { |
120 sender_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 132 sender_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
121 receiver_clock_->SetSkew( | 133 receiver_clock_->SetSkew( |
122 1.0, // No skew. | 134 1.0, // No skew. |
123 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds)); | 135 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds)); |
124 | 136 |
125 sender_to_receiver_.set_rtcp_destination(&rtcp_for_receiver_); | 137 sender_to_receiver_.set_rtcp_destination(&rtcp_for_receiver_); |
126 receiver_to_sender_.set_rtcp_destination(&rtcp_for_sender_); | 138 receiver_to_sender_.set_rtcp_destination(&rtcp_for_sender_); |
127 } | 139 } |
128 | 140 |
129 ~RtcpTest() override {} | 141 ~RtcpTest() override {} |
130 | 142 |
131 scoped_ptr<base::SimpleTestTickClock> sender_clock_; | 143 scoped_ptr<base::SimpleTestTickClock> sender_clock_; |
132 scoped_ptr<test::SkewedTickClock> receiver_clock_; | 144 scoped_ptr<test::SkewedTickClock> receiver_clock_; |
133 FakeRtcpTransport sender_to_receiver_; | 145 FakeRtcpTransport sender_to_receiver_; |
134 FakeRtcpTransport receiver_to_sender_; | 146 FakeRtcpTransport receiver_to_sender_; |
135 MockFrameSender mock_frame_sender_; | 147 MockFrameSender mock_frame_sender_; |
136 Rtcp rtcp_for_sender_; | 148 SenderRtcpSession rtcp_for_sender_; |
137 Rtcp rtcp_for_receiver_; | 149 ReceiverRtcpSession rtcp_for_receiver_; |
138 | 150 |
| 151 private: |
139 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 152 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
140 }; | 153 }; |
141 | 154 |
142 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) { | 155 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) { |
143 // Initially, expect no lip-sync info receiver-side without having first | 156 // Initially, expect no lip-sync info receiver-side without having first |
144 // received a RTCP packet. | 157 // received a RTCP packet. |
145 base::TimeTicks reference_time; | 158 base::TimeTicks reference_time; |
146 RtpTimeTicks rtp_timestamp; | 159 RtpTimeTicks rtp_timestamp; |
147 ASSERT_FALSE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp, | 160 ASSERT_FALSE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp, |
148 &reference_time)); | 161 &reference_time)); |
149 | 162 |
150 // Send a Sender Report to the receiver. | 163 // Send a Sender Report to the receiver. |
151 const base::TimeTicks reference_time_sent = sender_clock_->NowTicks(); | 164 const base::TimeTicks reference_time_sent = sender_clock_->NowTicks(); |
152 const RtpTimeTicks rtp_timestamp_sent = | 165 const RtpTimeTicks rtp_timestamp_sent = |
153 RtpTimeTicks().Expand(UINT32_C(0xbee5)); | 166 RtpTimeTicks().Expand(UINT32_C(0xbee5)); |
154 rtcp_for_sender_.SendRtcpFromRtpSender( | 167 rtcp_for_sender_.SendRtcpReport(reference_time_sent, rtp_timestamp_sent, 1, |
155 reference_time_sent, rtp_timestamp_sent, 1, 1); | 168 1); |
156 | 169 |
157 // Now the receiver should have lip-sync info. Confirm that the lip-sync | 170 // Now the receiver should have lip-sync info. Confirm that the lip-sync |
158 // reference time is the same as that sent. | 171 // reference time is the same as that sent. |
159 EXPECT_TRUE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp, | 172 EXPECT_TRUE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp, |
160 &reference_time)); | 173 &reference_time)); |
161 const base::TimeTicks rolled_back_time = | 174 const base::TimeTicks rolled_back_time = |
162 (reference_time - | 175 (reference_time - |
163 // Roll-back relative clock offset: | 176 // Roll-back relative clock offset: |
164 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds) - | 177 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds) - |
165 // Roll-back packet transmission time (because RTT is not yet known): | 178 // Roll-back packet transmission time (because RTT is not yet known): |
166 sender_to_receiver_.packet_delay()); | 179 sender_to_receiver_.packet_delay()); |
167 EXPECT_NEAR(0, (reference_time_sent - rolled_back_time).InMicroseconds(), 5); | 180 EXPECT_NEAR(0, (reference_time_sent - rolled_back_time).InMicroseconds(), 5); |
168 EXPECT_EQ(rtp_timestamp_sent, rtp_timestamp); | 181 EXPECT_EQ(rtp_timestamp_sent, rtp_timestamp); |
169 } | 182 } |
170 | 183 |
171 // TODO(miu): There were a few tests here that didn't actually test anything | 184 // TODO(miu): There were a few tests here that didn't actually test anything |
172 // except that the code wouldn't crash and a callback method was invoked. We | 185 // except that the code wouldn't crash and a callback method was invoked. We |
173 // need to fill-in more testing of RTCP now that much of the refactoring work | 186 // need to fill-in more testing of RTCP now that much of the refactoring work |
174 // has been completed. | 187 // has been completed. |
175 | 188 |
176 TEST_F(RtcpTest, RoundTripTimesDeterminedFromReportPingPong) { | 189 TEST_F(RtcpTest, RoundTripTimesDeterminedFromReportPingPong) { |
177 const int iterations = 12; | 190 const int iterations = 12; |
178 EXPECT_CALL(mock_frame_sender_, OnMeasuredRoundTripTime(_)) | 191 EXPECT_CALL(mock_frame_sender_, OnMeasuredRoundTripTime(_)) |
179 .Times(iterations); | 192 .Times(iterations); |
180 | 193 |
181 // Initially, neither side knows the round trip time. | 194 // Sender does not know the RTT yet. |
182 ASSERT_EQ(base::TimeDelta(), rtcp_for_sender_.current_round_trip_time()); | 195 ASSERT_EQ(base::TimeDelta(), rtcp_for_sender_.current_round_trip_time()); |
183 ASSERT_EQ(base::TimeDelta(), rtcp_for_receiver_.current_round_trip_time()); | |
184 | 196 |
185 // Do a number of ping-pongs, checking how the round trip times are measured | 197 // Do a number of ping-pongs, checking how the round trip times are measured |
186 // by the sender and receiver. | 198 // by the sender. |
187 base::TimeDelta expected_rtt_according_to_sender; | 199 base::TimeDelta expected_rtt_according_to_sender; |
188 base::TimeDelta expected_rtt_according_to_receiver; | |
189 for (int i = 0; i < iterations; ++i) { | 200 for (int i = 0; i < iterations; ++i) { |
190 const base::TimeDelta one_way_trip_time = | 201 const base::TimeDelta one_way_trip_time = |
191 base::TimeDelta::FromMilliseconds(1 << i); | 202 base::TimeDelta::FromMilliseconds(1 << i); |
192 sender_to_receiver_.set_packet_delay(one_way_trip_time); | 203 sender_to_receiver_.set_packet_delay(one_way_trip_time); |
193 receiver_to_sender_.set_packet_delay(one_way_trip_time); | 204 receiver_to_sender_.set_packet_delay(one_way_trip_time); |
194 | 205 |
195 // Sender --> Receiver | 206 // Sender --> Receiver |
196 base::TimeTicks reference_time_sent = sender_clock_->NowTicks(); | 207 base::TimeTicks reference_time_sent = sender_clock_->NowTicks(); |
197 const RtpTimeTicks rtp_timestamp_sent = | 208 const RtpTimeTicks rtp_timestamp_sent = |
198 RtpTimeTicks().Expand<uint32_t>(0xbee5) + RtpTimeDelta::FromTicks(i); | 209 RtpTimeTicks().Expand<uint32_t>(0xbee5) + RtpTimeDelta::FromTicks(i); |
199 rtcp_for_sender_.SendRtcpFromRtpSender( | 210 rtcp_for_sender_.SendRtcpReport(reference_time_sent, rtp_timestamp_sent, 1, |
200 reference_time_sent, rtp_timestamp_sent, 1, 1); | 211 1); |
201 EXPECT_EQ(expected_rtt_according_to_sender, | 212 EXPECT_EQ(expected_rtt_according_to_sender, |
202 rtcp_for_sender_.current_round_trip_time()); | 213 rtcp_for_sender_.current_round_trip_time()); |
203 #ifdef SENDER_PROVIDES_REPORT_BLOCK | |
204 EXPECT_EQ(expected_rtt_according_to_receiver, | |
205 rtcp_for_receiver_.current_round_trip_time()); | |
206 #endif | |
207 | 214 |
208 // Receiver --> Sender | 215 // Receiver --> Sender |
209 RtpReceiverStatistics stats; | 216 RtpReceiverStatistics stats; |
210 rtcp_for_receiver_.SendRtcpFromRtpReceiver( | 217 rtcp_for_receiver_.SendRtcpReport( |
211 rtcp_for_receiver_.ConvertToNTPAndSave(receiver_clock_->NowTicks()), | 218 CreateRtcpTimeData(receiver_clock_->NowTicks()), NULL, |
212 NULL, base::TimeDelta(), NULL, &stats); | 219 base::TimeDelta(), NULL, &stats); |
213 expected_rtt_according_to_sender = one_way_trip_time * 2; | 220 expected_rtt_according_to_sender = one_way_trip_time * 2; |
214 EXPECT_EQ(expected_rtt_according_to_sender, | 221 EXPECT_EQ(expected_rtt_according_to_sender, |
215 rtcp_for_sender_.current_round_trip_time()); | 222 rtcp_for_sender_.current_round_trip_time()); |
216 #ifdef SENDER_PROVIDES_REPORT_BLOCK | |
217 EXPECT_EQ(expected_rtt_according_to_receiver, | |
218 rtcp_for_receiver_.current_round_trip_time()); | |
219 #endif | |
220 | |
221 // In the next iteration of this loop, after the receiver gets the sender | |
222 // report, it will be measuring a round trip time consisting of two | |
223 // different one-way trip times. | |
224 expected_rtt_according_to_receiver = | |
225 (one_way_trip_time + one_way_trip_time * 2) / 2; | |
226 } | 223 } |
227 } | 224 } |
228 | 225 |
229 TEST_F(RtcpTest, RejectOldRtcpPacket) { | 226 TEST_F(RtcpTest, RejectOldRtcpPacket) { |
230 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)) | 227 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)) |
231 .Times(1); | 228 .Times(1); |
232 | 229 |
233 // This is rejected. | 230 // This is rejected. |
234 RtcpCastMessage cast_message(kSenderSsrc); | 231 RtcpCastMessage cast_message(kSenderSsrc); |
235 cast_message.ack_frame_id = 1; | 232 cast_message.ack_frame_id = 1; |
236 receiver_to_sender_.Pause(); | 233 receiver_to_sender_.Pause(); |
237 rtcp_for_receiver_.SendRtcpFromRtpReceiver( | 234 rtcp_for_receiver_.SendRtcpReport( |
238 rtcp_for_receiver_.ConvertToNTPAndSave( | 235 CreateRtcpTimeData(receiver_clock_->NowTicks() - |
239 receiver_clock_->NowTicks() - base::TimeDelta::FromSeconds(10)), | 236 base::TimeDelta::FromSeconds(10)), |
240 &cast_message, base::TimeDelta(), NULL, NULL); | 237 &cast_message, base::TimeDelta(), NULL, NULL); |
241 | 238 |
242 cast_message.ack_frame_id = 2; | 239 cast_message.ack_frame_id = 2; |
243 rtcp_for_receiver_.SendRtcpFromRtpReceiver( | 240 rtcp_for_receiver_.SendRtcpReport( |
244 rtcp_for_receiver_.ConvertToNTPAndSave(receiver_clock_->NowTicks()), | 241 CreateRtcpTimeData(receiver_clock_->NowTicks()), &cast_message, |
245 &cast_message, base::TimeDelta(), NULL, NULL); | 242 base::TimeDelta(), NULL, NULL); |
246 | 243 |
247 receiver_to_sender_.ReversePacketQueue(); | 244 receiver_to_sender_.ReversePacketQueue(); |
248 receiver_to_sender_.Unpause(); | 245 receiver_to_sender_.Unpause(); |
249 } | 246 } |
250 | 247 |
251 TEST_F(RtcpTest, NegativeTimeTicks) { | 248 TEST_F(RtcpTest, NegativeTimeTicks) { |
252 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)) | 249 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)) |
253 .Times(2); | 250 .Times(2); |
254 | 251 |
255 // Send a RRTR with NTP timestamp that translates to a very negative | 252 // Send a RRTR with NTP timestamp that translates to a very negative |
256 // value for TimeTicks. | 253 // value for TimeTicks. |
257 RtcpCastMessage cast_message(kSenderSsrc); | 254 RtcpCastMessage cast_message(kSenderSsrc); |
258 cast_message.ack_frame_id = 2; | 255 cast_message.ack_frame_id = 2; |
259 rtcp_for_receiver_.SendRtcpFromRtpReceiver( | 256 rtcp_for_receiver_.SendRtcpReport( |
260 rtcp_for_receiver_.ConvertToNTPAndSave( | 257 CreateRtcpTimeData(base::TimeTicks() - base::TimeDelta::FromSeconds(5)), |
261 base::TimeTicks() - base::TimeDelta::FromSeconds(5)), | |
262 &cast_message, base::TimeDelta(), NULL, NULL); | 258 &cast_message, base::TimeDelta(), NULL, NULL); |
263 | 259 |
264 cast_message.ack_frame_id = 1; | 260 cast_message.ack_frame_id = 1; |
265 rtcp_for_receiver_.SendRtcpFromRtpReceiver( | 261 rtcp_for_receiver_.SendRtcpReport(CreateRtcpTimeData(base::TimeTicks()), |
266 rtcp_for_receiver_.ConvertToNTPAndSave(base::TimeTicks()), | 262 &cast_message, base::TimeDelta(), NULL, |
267 &cast_message, base::TimeDelta(), NULL, NULL); | 263 NULL); |
268 } | 264 } |
269 | 265 |
270 // TODO(miu): Find a better home for this test. | 266 // TODO(miu): Find a better home for this test. |
271 TEST(MisplacedCastTest, NtpAndTime) { | 267 TEST(MisplacedCastTest, NtpAndTime) { |
272 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); | 268 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); |
273 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); | 269 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); |
274 | 270 |
275 uint32 ntp_seconds_1 = 0; | 271 uint32 ntp_seconds_1 = 0; |
276 uint32 ntp_fraction_1 = 0; | 272 uint32 ntp_fraction_1 = 0; |
277 base::TimeTicks input_time = base::TimeTicks::Now(); | 273 base::TimeTicks input_time = base::TimeTicks::Now(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | 305 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
310 EXPECT_EQ(input_time, out_3); // Verify inverse. | 306 EXPECT_EQ(input_time, out_3); // Verify inverse. |
311 | 307 |
312 // Verify delta. | 308 // Verify delta. |
313 EXPECT_EQ((out_3 - out_2), time_delta); | 309 EXPECT_EQ((out_3 - out_2), time_delta); |
314 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | 310 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
315 } | 311 } |
316 | 312 |
317 } // namespace cast | 313 } // namespace cast |
318 } // namespace media | 314 } // namespace media |
OLD | NEW |