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

Side by Side Diff: media/cast/net/rtcp/rtcp_unittest.cc

Issue 1520613004: cast: Split Rtcp into two for sender and receiver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@timestamp
Patch Set: Rebased Created 4 years, 11 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/cast/net/rtcp/rtcp_session.h ('k') | media/cast/net/rtcp/rtcp_utility.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « media/cast/net/rtcp/rtcp_session.h ('k') | media/cast/net/rtcp/rtcp_utility.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698