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

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: Add missing rtcp_session.h and a few comments Created 5 years 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698