| 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" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 : sender_clock_(new base::SimpleTestTickClock()), | 80 : sender_clock_(new base::SimpleTestTickClock()), |
| 81 receiver_clock_(new test::SkewedTickClock(sender_clock_.get())), | 81 receiver_clock_(new test::SkewedTickClock(sender_clock_.get())), |
| 82 sender_to_receiver_(sender_clock_.get()), | 82 sender_to_receiver_(sender_clock_.get()), |
| 83 receiver_to_sender_(sender_clock_.get()), | 83 receiver_to_sender_(sender_clock_.get()), |
| 84 rtcp_for_sender_( | 84 rtcp_for_sender_( |
| 85 base::Bind(&RtcpTest::OnReceivedCastFeedback, | 85 base::Bind(&RtcpTest::OnReceivedCastFeedback, |
| 86 base::Unretained(this)), | 86 base::Unretained(this)), |
| 87 base::Bind(&RtcpTest::OnMeasuredRoundTripTime, | 87 base::Bind(&RtcpTest::OnMeasuredRoundTripTime, |
| 88 base::Unretained(this)), | 88 base::Unretained(this)), |
| 89 base::Bind(&RtcpTest::OnReceivedLogs, base::Unretained(this)), | 89 base::Bind(&RtcpTest::OnReceivedLogs, base::Unretained(this)), |
| 90 base::Bind(&RtcpTest::OnReceivedPli, base::Unretained(this)), |
| 90 sender_clock_.get(), | 91 sender_clock_.get(), |
| 91 &sender_to_receiver_, | 92 &sender_to_receiver_, |
| 92 kSenderSsrc, | 93 kSenderSsrc, |
| 93 kReceiverSsrc), | 94 kReceiverSsrc), |
| 94 rtcp_for_receiver_(receiver_clock_.get(), | 95 rtcp_for_receiver_(receiver_clock_.get(), |
| 95 &receiver_to_sender_, | 96 &receiver_to_sender_, |
| 96 kReceiverSsrc, | 97 kReceiverSsrc, |
| 97 kSenderSsrc) { | 98 kSenderSsrc), |
| 99 received_pli_(false) { |
| 98 sender_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 100 sender_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
| 99 receiver_clock_->SetSkew( | 101 receiver_clock_->SetSkew( |
| 100 1.0, // No skew. | 102 1.0, // No skew. |
| 101 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds)); | 103 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds)); |
| 102 | 104 |
| 103 sender_to_receiver_.set_rtcp_destination(&rtcp_for_receiver_); | 105 sender_to_receiver_.set_rtcp_destination(&rtcp_for_receiver_); |
| 104 receiver_to_sender_.set_rtcp_destination(&rtcp_for_sender_); | 106 receiver_to_sender_.set_rtcp_destination(&rtcp_for_sender_); |
| 105 } | 107 } |
| 106 | 108 |
| 107 ~RtcpTest() override {} | 109 ~RtcpTest() override {} |
| (...skipping 18 matching lines...) Expand all Loading... |
| 126 RtcpReceiverEventLogMessage event_log; | 128 RtcpReceiverEventLogMessage event_log; |
| 127 event_log.type = event_log_msg.type; | 129 event_log.type = event_log_msg.type; |
| 128 event_log.event_timestamp = event_log_msg.event_timestamp; | 130 event_log.event_timestamp = event_log_msg.event_timestamp; |
| 129 event_log.delay_delta = event_log_msg.delay_delta; | 131 event_log.delay_delta = event_log_msg.delay_delta; |
| 130 event_log.packet_id = event_log_msg.packet_id; | 132 event_log.packet_id = event_log_msg.packet_id; |
| 131 last_logs_.back().event_log_messages_.push_back(event_log); | 133 last_logs_.back().event_log_messages_.push_back(event_log); |
| 132 } | 134 } |
| 133 } | 135 } |
| 134 } | 136 } |
| 135 | 137 |
| 138 void OnReceivedPli() { received_pli_ = true; } |
| 139 |
| 136 scoped_ptr<base::SimpleTestTickClock> sender_clock_; | 140 scoped_ptr<base::SimpleTestTickClock> sender_clock_; |
| 137 scoped_ptr<test::SkewedTickClock> receiver_clock_; | 141 scoped_ptr<test::SkewedTickClock> receiver_clock_; |
| 138 FakeRtcpTransport sender_to_receiver_; | 142 FakeRtcpTransport sender_to_receiver_; |
| 139 FakeRtcpTransport receiver_to_sender_; | 143 FakeRtcpTransport receiver_to_sender_; |
| 140 SenderRtcpSession rtcp_for_sender_; | 144 SenderRtcpSession rtcp_for_sender_; |
| 141 ReceiverRtcpSession rtcp_for_receiver_; | 145 ReceiverRtcpSession rtcp_for_receiver_; |
| 142 | 146 |
| 143 base::TimeDelta current_round_trip_time_; | 147 base::TimeDelta current_round_trip_time_; |
| 144 RtcpCastMessage last_cast_message_; | 148 RtcpCastMessage last_cast_message_; |
| 145 RtcpReceiverLogMessage last_logs_; | 149 RtcpReceiverLogMessage last_logs_; |
| 150 bool received_pli_; |
| 146 | 151 |
| 147 private: | 152 private: |
| 148 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 153 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
| 149 }; | 154 }; |
| 150 | 155 |
| 151 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) { | 156 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) { |
| 152 // Initially, expect no lip-sync info receiver-side without having first | 157 // Initially, expect no lip-sync info receiver-side without having first |
| 153 // received a RTCP packet. | 158 // received a RTCP packet. |
| 154 base::TimeTicks reference_time; | 159 base::TimeTicks reference_time; |
| 155 RtpTimeTicks rtp_timestamp; | 160 RtpTimeTicks rtp_timestamp; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 EXPECT_EQ(expected_rtt_according_to_sender, | 206 EXPECT_EQ(expected_rtt_according_to_sender, |
| 202 rtcp_for_sender_.current_round_trip_time()); | 207 rtcp_for_sender_.current_round_trip_time()); |
| 203 | 208 |
| 204 // Validate last reported callback value is same as that reported by method. | 209 // Validate last reported callback value is same as that reported by method. |
| 205 EXPECT_EQ(current_round_trip_time_, | 210 EXPECT_EQ(current_round_trip_time_, |
| 206 rtcp_for_sender_.current_round_trip_time()); | 211 rtcp_for_sender_.current_round_trip_time()); |
| 207 | 212 |
| 208 // Receiver --> Sender | 213 // Receiver --> Sender |
| 209 RtpReceiverStatistics stats; | 214 RtpReceiverStatistics stats; |
| 210 rtcp_for_receiver_.SendRtcpReport( | 215 rtcp_for_receiver_.SendRtcpReport( |
| 211 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, | 216 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, nullptr, |
| 212 base::TimeDelta(), nullptr, &stats); | 217 base::TimeDelta(), nullptr, &stats); |
| 213 expected_rtt_according_to_sender = one_way_trip_time * 2; | 218 expected_rtt_according_to_sender = one_way_trip_time * 2; |
| 214 EXPECT_EQ(expected_rtt_according_to_sender, | 219 EXPECT_EQ(expected_rtt_according_to_sender, |
| 215 rtcp_for_sender_.current_round_trip_time()); | 220 rtcp_for_sender_.current_round_trip_time()); |
| 216 } | 221 } |
| 217 } | 222 } |
| 218 | 223 |
| 219 TEST_F(RtcpTest, ReportCastFeedback) { | 224 TEST_F(RtcpTest, ReportCastFeedback) { |
| 220 RtcpCastMessage cast_message(kSenderSsrc); | 225 RtcpCastMessage cast_message(kSenderSsrc); |
| 221 cast_message.ack_frame_id = 5; | 226 cast_message.ack_frame_id = 5; |
| 222 PacketIdSet missing_packets1 = {3, 4}; | 227 PacketIdSet missing_packets1 = {3, 4}; |
| 223 cast_message.missing_frames_and_packets[1] = missing_packets1; | 228 cast_message.missing_frames_and_packets[1] = missing_packets1; |
| 224 PacketIdSet missing_packets2 = {5, 6}; | 229 PacketIdSet missing_packets2 = {5, 6}; |
| 225 cast_message.missing_frames_and_packets[2] = missing_packets2; | 230 cast_message.missing_frames_and_packets[2] = missing_packets2; |
| 226 | 231 |
| 227 rtcp_for_receiver_.SendRtcpReport( | 232 rtcp_for_receiver_.SendRtcpReport( |
| 228 CreateRtcpTimeData(base::TimeTicks()), &cast_message, | 233 CreateRtcpTimeData(base::TimeTicks()), &cast_message, nullptr, |
| 229 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr); | 234 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr); |
| 230 | 235 |
| 231 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); | 236 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); |
| 232 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); | 237 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); |
| 233 EXPECT_EQ(last_cast_message_.missing_frames_and_packets.size(), | 238 EXPECT_EQ(last_cast_message_.missing_frames_and_packets.size(), |
| 234 cast_message.missing_frames_and_packets.size()); | 239 cast_message.missing_frames_and_packets.size()); |
| 235 EXPECT_TRUE( | 240 EXPECT_TRUE( |
| 236 std::equal(cast_message.missing_frames_and_packets.begin(), | 241 std::equal(cast_message.missing_frames_and_packets.begin(), |
| 237 cast_message.missing_frames_and_packets.end(), | 242 cast_message.missing_frames_and_packets.end(), |
| 238 last_cast_message_.missing_frames_and_packets.begin())); | 243 last_cast_message_.missing_frames_and_packets.begin())); |
| 239 } | 244 } |
| 240 | 245 |
| 246 TEST_F(RtcpTest, ReportPli) { |
| 247 RtcpPliMessage pli_message(kSenderSsrc); |
| 248 rtcp_for_receiver_.SendRtcpReport( |
| 249 CreateRtcpTimeData(base::TimeTicks()), nullptr, &pli_message, |
| 250 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr); |
| 251 EXPECT_TRUE(received_pli_); |
| 252 } |
| 253 |
| 241 TEST_F(RtcpTest, DropLateRtcpPacket) { | 254 TEST_F(RtcpTest, DropLateRtcpPacket) { |
| 242 RtcpCastMessage cast_message(kSenderSsrc); | 255 RtcpCastMessage cast_message(kSenderSsrc); |
| 243 cast_message.ack_frame_id = 1; | 256 cast_message.ack_frame_id = 1; |
| 244 rtcp_for_receiver_.SendRtcpReport( | 257 rtcp_for_receiver_.SendRtcpReport( |
| 245 CreateRtcpTimeData(receiver_clock_->NowTicks()), &cast_message, | 258 CreateRtcpTimeData(receiver_clock_->NowTicks()), &cast_message, nullptr, |
| 246 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr); | 259 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr); |
| 247 | 260 |
| 248 // Send a packet with old timestamp | 261 // Send a packet with old timestamp |
| 249 RtcpCastMessage late_cast_message(kSenderSsrc); | 262 RtcpCastMessage late_cast_message(kSenderSsrc); |
| 250 late_cast_message.ack_frame_id = 2; | 263 late_cast_message.ack_frame_id = 2; |
| 251 rtcp_for_receiver_.SendRtcpReport( | 264 rtcp_for_receiver_.SendRtcpReport( |
| 252 CreateRtcpTimeData(receiver_clock_->NowTicks() - | 265 CreateRtcpTimeData(receiver_clock_->NowTicks() - |
| 253 base::TimeDelta::FromSeconds(10)), | 266 base::TimeDelta::FromSeconds(10)), |
| 254 &late_cast_message, base::TimeDelta(), nullptr, nullptr); | 267 &late_cast_message, nullptr, base::TimeDelta(), nullptr, nullptr); |
| 255 | 268 |
| 256 // Validate data from second packet is dropped. | 269 // Validate data from second packet is dropped. |
| 257 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); | 270 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); |
| 258 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); | 271 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); |
| 259 | 272 |
| 260 // Re-send with fresh timestamp | 273 // Re-send with fresh timestamp |
| 261 late_cast_message.ack_frame_id = 2; | 274 late_cast_message.ack_frame_id = 2; |
| 262 rtcp_for_receiver_.SendRtcpReport( | 275 rtcp_for_receiver_.SendRtcpReport( |
| 263 CreateRtcpTimeData(receiver_clock_->NowTicks()), &late_cast_message, | 276 CreateRtcpTimeData(receiver_clock_->NowTicks()), &late_cast_message, |
| 264 base::TimeDelta(), nullptr, nullptr); | 277 nullptr, base::TimeDelta(), nullptr, nullptr); |
| 265 EXPECT_EQ(last_cast_message_.ack_frame_id, late_cast_message.ack_frame_id); | 278 EXPECT_EQ(last_cast_message_.ack_frame_id, late_cast_message.ack_frame_id); |
| 266 EXPECT_EQ(last_cast_message_.target_delay_ms, 0); | 279 EXPECT_EQ(last_cast_message_.target_delay_ms, 0); |
| 267 } | 280 } |
| 268 | 281 |
| 269 TEST_F(RtcpTest, ReportReceiverEvents) { | 282 TEST_F(RtcpTest, ReportReceiverEvents) { |
| 270 const RtpTimeTicks kRtpTimeStamp = | 283 const RtpTimeTicks kRtpTimeStamp = |
| 271 media::cast::RtpTimeTicks().Expand(UINT32_C(100)); | 284 media::cast::RtpTimeTicks().Expand(UINT32_C(100)); |
| 272 const base::TimeTicks kEventTimestamp = receiver_clock_->NowTicks(); | 285 const base::TimeTicks kEventTimestamp = receiver_clock_->NowTicks(); |
| 273 const base::TimeDelta kDelayDelta = base::TimeDelta::FromMilliseconds(100); | 286 const base::TimeDelta kDelayDelta = base::TimeDelta::FromMilliseconds(100); |
| 274 | 287 |
| 275 RtcpEvent event; | 288 RtcpEvent event; |
| 276 event.type = FRAME_ACK_SENT; | 289 event.type = FRAME_ACK_SENT; |
| 277 event.timestamp = kEventTimestamp; | 290 event.timestamp = kEventTimestamp; |
| 278 event.delay_delta = kDelayDelta; | 291 event.delay_delta = kDelayDelta; |
| 279 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; | 292 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; |
| 280 rtcp_events.push_back(std::make_pair(kRtpTimeStamp, event)); | 293 rtcp_events.push_back(std::make_pair(kRtpTimeStamp, event)); |
| 281 | 294 |
| 282 rtcp_for_receiver_.SendRtcpReport( | 295 rtcp_for_receiver_.SendRtcpReport( |
| 283 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, | 296 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, nullptr, |
| 284 base::TimeDelta(), &rtcp_events, nullptr); | 297 base::TimeDelta(), &rtcp_events, nullptr); |
| 285 | 298 |
| 286 ASSERT_EQ(1UL, last_logs_.size()); | 299 ASSERT_EQ(1UL, last_logs_.size()); |
| 287 RtcpReceiverFrameLogMessage frame_log = last_logs_.front(); | 300 RtcpReceiverFrameLogMessage frame_log = last_logs_.front(); |
| 288 EXPECT_EQ(frame_log.rtp_timestamp_, kRtpTimeStamp); | 301 EXPECT_EQ(frame_log.rtp_timestamp_, kRtpTimeStamp); |
| 289 | 302 |
| 290 ASSERT_EQ(1UL, frame_log.event_log_messages_.size()); | 303 ASSERT_EQ(1UL, frame_log.event_log_messages_.size()); |
| 291 RtcpReceiverEventLogMessage log_msg = frame_log.event_log_messages_.back(); | 304 RtcpReceiverEventLogMessage log_msg = frame_log.event_log_messages_.back(); |
| 292 EXPECT_EQ(log_msg.type, event.type); | 305 EXPECT_EQ(log_msg.type, event.type); |
| 293 EXPECT_EQ(log_msg.delay_delta, event.delay_delta); | 306 EXPECT_EQ(log_msg.delay_delta, event.delay_delta); |
| 294 // Only 24 bits of event timestamp sent on wire. | 307 // Only 24 bits of event timestamp sent on wire. |
| 295 uint32_t event_ts = | 308 uint32_t event_ts = |
| 296 (event.timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; | 309 (event.timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; |
| 297 uint32_t log_msg_ts = | 310 uint32_t log_msg_ts = |
| 298 (log_msg.event_timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; | 311 (log_msg.event_timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; |
| 299 EXPECT_EQ(log_msg_ts, event_ts); | 312 EXPECT_EQ(log_msg_ts, event_ts); |
| 300 } | 313 } |
| 301 | 314 |
| 302 } // namespace cast | 315 } // namespace cast |
| 303 } // namespace media | 316 } // namespace media |
| OLD | NEW |