| 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 |