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