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