| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 : sender_clock_(new base::SimpleTestTickClock()), | 81 : sender_clock_(new base::SimpleTestTickClock()), |
| 82 receiver_clock_(new test::SkewedTickClock(sender_clock_.get())), | 82 receiver_clock_(new test::SkewedTickClock(sender_clock_.get())), |
| 83 rtp_sender_pacer_(sender_clock_.get()), | 83 rtp_sender_pacer_(sender_clock_.get()), |
| 84 rtp_receiver_pacer_(sender_clock_.get()), | 84 rtp_receiver_pacer_(sender_clock_.get()), |
| 85 rtcp_at_rtp_sender_( | 85 rtcp_at_rtp_sender_( |
| 86 base::Bind(&RtcpTest::OnReceivedCastFeedback, | 86 base::Bind(&RtcpTest::OnReceivedCastFeedback, |
| 87 base::Unretained(this)), | 87 base::Unretained(this)), |
| 88 base::Bind(&RtcpTest::OnMeasuredRoundTripTime, | 88 base::Bind(&RtcpTest::OnMeasuredRoundTripTime, |
| 89 base::Unretained(this)), | 89 base::Unretained(this)), |
| 90 base::Bind(&RtcpTest::OnReceivedLogs, base::Unretained(this)), | 90 base::Bind(&RtcpTest::OnReceivedLogs, base::Unretained(this)), |
| 91 base::Bind(&RtcpTest::OnReceivedPli, base::Unretained(this)), |
| 91 sender_clock_.get(), | 92 sender_clock_.get(), |
| 92 &rtp_sender_pacer_, | 93 &rtp_sender_pacer_, |
| 93 kSenderSsrc, | 94 kSenderSsrc, |
| 94 kReceiverSsrc), | 95 kReceiverSsrc), |
| 95 rtcp_at_rtp_receiver_(receiver_clock_.get(), | 96 rtcp_at_rtp_receiver_(receiver_clock_.get(), |
| 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 rtp_sender_pacer_.set_rtcp_destination(&rtcp_at_rtp_receiver_); | 105 rtp_sender_pacer_.set_rtcp_destination(&rtcp_at_rtp_receiver_); |
| 104 rtp_receiver_pacer_.set_rtcp_destination(&rtcp_at_rtp_sender_); | 106 rtp_receiver_pacer_.set_rtcp_destination(&rtcp_at_rtp_sender_); |
| 105 } | 107 } |
| 106 | 108 |
| 107 ~RtcpTest() override {} | 109 ~RtcpTest() override {} |
| (...skipping 21 matching lines...) Expand all Loading... |
| 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 |
| 136 PacketRef BuildRtcpPacketFromRtpReceiver( | 138 PacketRef BuildRtcpPacketFromRtpReceiver( |
| 137 const RtcpTimeData& time_data, | 139 const RtcpTimeData& time_data, |
| 138 const RtcpCastMessage* cast_message, | 140 const RtcpCastMessage* cast_message, |
| 141 const RtcpPliMessage* pli_message, |
| 139 base::TimeDelta target_delay, | 142 base::TimeDelta target_delay, |
| 140 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, | 143 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, |
| 141 const RtpReceiverStatistics* rtp_receiver_statistics) { | 144 const RtpReceiverStatistics* rtp_receiver_statistics) { |
| 142 RtcpBuilder builder(rtcp_at_rtp_receiver_.local_ssrc()); | 145 RtcpBuilder builder(rtcp_at_rtp_receiver_.local_ssrc()); |
| 143 builder.Start(); | 146 builder.Start(); |
| 144 RtcpReceiverReferenceTimeReport rrtr; | 147 RtcpReceiverReferenceTimeReport rrtr; |
| 145 rrtr.ntp_seconds = time_data.ntp_seconds; | 148 rrtr.ntp_seconds = time_data.ntp_seconds; |
| 146 rrtr.ntp_fraction = time_data.ntp_fraction; | 149 rrtr.ntp_fraction = time_data.ntp_fraction; |
| 147 builder.AddRrtr(rrtr); | 150 builder.AddRrtr(rrtr); |
| 148 RtcpReportBlock report_block; | 151 RtcpReportBlock report_block; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 165 &delay_fraction); | 168 &delay_fraction); |
| 166 report_block.delay_since_last_sr = | 169 report_block.delay_since_last_sr = |
| 167 ConvertToNtpDiff(delay_seconds, delay_fraction); | 170 ConvertToNtpDiff(delay_seconds, delay_fraction); |
| 168 } else { | 171 } else { |
| 169 report_block.delay_since_last_sr = 0; | 172 report_block.delay_since_last_sr = 0; |
| 170 } | 173 } |
| 171 builder.AddRR(&report_block); | 174 builder.AddRR(&report_block); |
| 172 } | 175 } |
| 173 if (cast_message) | 176 if (cast_message) |
| 174 builder.AddCast(*cast_message, target_delay); | 177 builder.AddCast(*cast_message, target_delay); |
| 178 if (pli_message) |
| 179 builder.AddPli(*pli_message); |
| 175 if (rtcp_events) | 180 if (rtcp_events) |
| 176 builder.AddReceiverLog(*rtcp_events); | 181 builder.AddReceiverLog(*rtcp_events); |
| 177 return builder.Finish(); | 182 return builder.Finish(); |
| 178 } | 183 } |
| 179 | 184 |
| 185 void OnReceivedPli() { received_pli_ = true; } |
| 186 |
| 180 scoped_ptr<base::SimpleTestTickClock> sender_clock_; | 187 scoped_ptr<base::SimpleTestTickClock> sender_clock_; |
| 181 scoped_ptr<test::SkewedTickClock> receiver_clock_; | 188 scoped_ptr<test::SkewedTickClock> receiver_clock_; |
| 182 FakeRtcpTransport rtp_sender_pacer_; | 189 FakeRtcpTransport rtp_sender_pacer_; |
| 183 FakeRtcpTransport rtp_receiver_pacer_; | 190 FakeRtcpTransport rtp_receiver_pacer_; |
| 184 SenderRtcpSession rtcp_at_rtp_sender_; | 191 SenderRtcpSession rtcp_at_rtp_sender_; |
| 185 ReceiverRtcpSession rtcp_at_rtp_receiver_; | 192 ReceiverRtcpSession rtcp_at_rtp_receiver_; |
| 186 | 193 |
| 187 base::TimeDelta current_round_trip_time_; | 194 base::TimeDelta current_round_trip_time_; |
| 188 RtcpCastMessage last_cast_message_; | 195 RtcpCastMessage last_cast_message_; |
| 189 RtcpReceiverLogMessage last_logs_; | 196 RtcpReceiverLogMessage last_logs_; |
| 197 bool received_pli_; |
| 190 | 198 |
| 191 private: | 199 private: |
| 192 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 200 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
| 193 }; | 201 }; |
| 194 | 202 |
| 195 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) { | 203 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) { |
| 196 // Initially, expect no lip-sync info receiver-side without having first | 204 // Initially, expect no lip-sync info receiver-side without having first |
| 197 // received a RTCP packet. | 205 // received a RTCP packet. |
| 198 base::TimeTicks reference_time; | 206 base::TimeTicks reference_time; |
| 199 RtpTimeTicks rtp_timestamp; | 207 RtpTimeTicks rtp_timestamp; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 | 255 |
| 248 // Validate last reported callback value is same as that reported by method. | 256 // Validate last reported callback value is same as that reported by method. |
| 249 EXPECT_EQ(current_round_trip_time_, | 257 EXPECT_EQ(current_round_trip_time_, |
| 250 rtcp_at_rtp_sender_.current_round_trip_time()); | 258 rtcp_at_rtp_sender_.current_round_trip_time()); |
| 251 | 259 |
| 252 // Receiver --> Sender | 260 // Receiver --> Sender |
| 253 RtpReceiverStatistics stats; | 261 RtpReceiverStatistics stats; |
| 254 rtp_receiver_pacer_.SendRtcpPacket( | 262 rtp_receiver_pacer_.SendRtcpPacket( |
| 255 rtcp_at_rtp_receiver_.local_ssrc(), | 263 rtcp_at_rtp_receiver_.local_ssrc(), |
| 256 BuildRtcpPacketFromRtpReceiver( | 264 BuildRtcpPacketFromRtpReceiver( |
| 257 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, | 265 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, nullptr, |
| 258 base::TimeDelta(), nullptr, &stats)); | 266 base::TimeDelta(), nullptr, &stats)); |
| 259 expected_rtt_according_to_sender = one_way_trip_time * 2; | 267 expected_rtt_according_to_sender = one_way_trip_time * 2; |
| 260 EXPECT_EQ(expected_rtt_according_to_sender, | 268 EXPECT_EQ(expected_rtt_according_to_sender, |
| 261 rtcp_at_rtp_sender_.current_round_trip_time()); | 269 rtcp_at_rtp_sender_.current_round_trip_time()); |
| 262 } | 270 } |
| 263 } | 271 } |
| 264 | 272 |
| 265 TEST_F(RtcpTest, ReportCastFeedback) { | 273 TEST_F(RtcpTest, ReportCastFeedback) { |
| 266 RtcpCastMessage cast_message(kSenderSsrc); | 274 RtcpCastMessage cast_message(kSenderSsrc); |
| 267 cast_message.ack_frame_id = 5; | 275 cast_message.ack_frame_id = 5; |
| 268 PacketIdSet missing_packets1 = {3, 4}; | 276 PacketIdSet missing_packets1 = {3, 4}; |
| 269 cast_message.missing_frames_and_packets[1] = missing_packets1; | 277 cast_message.missing_frames_and_packets[1] = missing_packets1; |
| 270 PacketIdSet missing_packets2 = {5, 6}; | 278 PacketIdSet missing_packets2 = {5, 6}; |
| 271 cast_message.missing_frames_and_packets[2] = missing_packets2; | 279 cast_message.missing_frames_and_packets[2] = missing_packets2; |
| 272 | 280 |
| 273 rtp_receiver_pacer_.SendRtcpPacket( | 281 rtp_receiver_pacer_.SendRtcpPacket( |
| 274 rtcp_at_rtp_receiver_.local_ssrc(), | 282 rtcp_at_rtp_receiver_.local_ssrc(), |
| 275 BuildRtcpPacketFromRtpReceiver( | 283 BuildRtcpPacketFromRtpReceiver( |
| 276 CreateRtcpTimeData(base::TimeTicks()), &cast_message, | 284 CreateRtcpTimeData(base::TimeTicks()), &cast_message, nullptr, |
| 277 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr)); | 285 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr)); |
| 278 | 286 |
| 279 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); | 287 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); |
| 280 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); | 288 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); |
| 281 EXPECT_EQ(last_cast_message_.missing_frames_and_packets.size(), | 289 EXPECT_EQ(last_cast_message_.missing_frames_and_packets.size(), |
| 282 cast_message.missing_frames_and_packets.size()); | 290 cast_message.missing_frames_and_packets.size()); |
| 283 EXPECT_TRUE( | 291 EXPECT_TRUE( |
| 284 std::equal(cast_message.missing_frames_and_packets.begin(), | 292 std::equal(cast_message.missing_frames_and_packets.begin(), |
| 285 cast_message.missing_frames_and_packets.end(), | 293 cast_message.missing_frames_and_packets.end(), |
| 286 last_cast_message_.missing_frames_and_packets.begin())); | 294 last_cast_message_.missing_frames_and_packets.begin())); |
| 287 } | 295 } |
| 288 | 296 |
| 297 TEST_F(RtcpTest, ReportPli) { |
| 298 RtcpPliMessage pli_message(kSenderSsrc); |
| 299 rtp_receiver_pacer_.SendRtcpPacket( |
| 300 rtcp_at_rtp_receiver_.local_ssrc(), |
| 301 BuildRtcpPacketFromRtpReceiver(CreateRtcpTimeData(base::TimeTicks()), |
| 302 nullptr, &pli_message, base::TimeDelta(), |
| 303 nullptr, nullptr)); |
| 304 EXPECT_TRUE(received_pli_); |
| 305 } |
| 306 |
| 289 TEST_F(RtcpTest, DropLateRtcpPacket) { | 307 TEST_F(RtcpTest, DropLateRtcpPacket) { |
| 290 RtcpCastMessage cast_message(kSenderSsrc); | 308 RtcpCastMessage cast_message(kSenderSsrc); |
| 291 cast_message.ack_frame_id = 1; | 309 cast_message.ack_frame_id = 1; |
| 292 rtp_receiver_pacer_.SendRtcpPacket( | 310 rtp_receiver_pacer_.SendRtcpPacket( |
| 293 rtcp_at_rtp_receiver_.local_ssrc(), | 311 rtcp_at_rtp_receiver_.local_ssrc(), |
| 294 BuildRtcpPacketFromRtpReceiver( | 312 BuildRtcpPacketFromRtpReceiver( |
| 295 CreateRtcpTimeData(receiver_clock_->NowTicks()), &cast_message, | 313 CreateRtcpTimeData(receiver_clock_->NowTicks()), &cast_message, |
| 296 base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, nullptr)); | 314 nullptr, base::TimeDelta::FromMilliseconds(kTargetDelayMs), nullptr, |
| 315 nullptr)); |
| 297 | 316 |
| 298 // Send a packet with old timestamp | 317 // Send a packet with old timestamp |
| 299 RtcpCastMessage late_cast_message(kSenderSsrc); | 318 RtcpCastMessage late_cast_message(kSenderSsrc); |
| 300 late_cast_message.ack_frame_id = 2; | 319 late_cast_message.ack_frame_id = 2; |
| 301 rtp_receiver_pacer_.SendRtcpPacket( | 320 rtp_receiver_pacer_.SendRtcpPacket( |
| 302 rtcp_at_rtp_receiver_.local_ssrc(), | 321 rtcp_at_rtp_receiver_.local_ssrc(), |
| 303 BuildRtcpPacketFromRtpReceiver( | 322 BuildRtcpPacketFromRtpReceiver( |
| 304 CreateRtcpTimeData(receiver_clock_->NowTicks() - | 323 CreateRtcpTimeData(receiver_clock_->NowTicks() - |
| 305 base::TimeDelta::FromSeconds(10)), | 324 base::TimeDelta::FromSeconds(10)), |
| 306 &late_cast_message, base::TimeDelta(), nullptr, nullptr)); | 325 &late_cast_message, nullptr, base::TimeDelta(), nullptr, nullptr)); |
| 307 | 326 |
| 308 // Validate data from second packet is dropped. | 327 // Validate data from second packet is dropped. |
| 309 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); | 328 EXPECT_EQ(last_cast_message_.ack_frame_id, cast_message.ack_frame_id); |
| 310 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); | 329 EXPECT_EQ(last_cast_message_.target_delay_ms, kTargetDelayMs); |
| 311 | 330 |
| 312 // Re-send with fresh timestamp | 331 // Re-send with fresh timestamp |
| 313 late_cast_message.ack_frame_id = 2; | 332 late_cast_message.ack_frame_id = 2; |
| 314 rtp_receiver_pacer_.SendRtcpPacket( | 333 rtp_receiver_pacer_.SendRtcpPacket( |
| 315 rtcp_at_rtp_receiver_.local_ssrc(), | 334 rtcp_at_rtp_receiver_.local_ssrc(), |
| 316 BuildRtcpPacketFromRtpReceiver( | 335 BuildRtcpPacketFromRtpReceiver( |
| 317 CreateRtcpTimeData(receiver_clock_->NowTicks()), &late_cast_message, | 336 CreateRtcpTimeData(receiver_clock_->NowTicks()), &late_cast_message, |
| 318 base::TimeDelta(), nullptr, nullptr)); | 337 nullptr, base::TimeDelta(), nullptr, nullptr)); |
| 319 EXPECT_EQ(last_cast_message_.ack_frame_id, late_cast_message.ack_frame_id); | 338 EXPECT_EQ(last_cast_message_.ack_frame_id, late_cast_message.ack_frame_id); |
| 320 EXPECT_EQ(last_cast_message_.target_delay_ms, 0); | 339 EXPECT_EQ(last_cast_message_.target_delay_ms, 0); |
| 321 } | 340 } |
| 322 | 341 |
| 323 TEST_F(RtcpTest, ReportReceiverEvents) { | 342 TEST_F(RtcpTest, ReportReceiverEvents) { |
| 324 const RtpTimeTicks kRtpTimeStamp = | 343 const RtpTimeTicks kRtpTimeStamp = |
| 325 media::cast::RtpTimeTicks().Expand(UINT32_C(100)); | 344 media::cast::RtpTimeTicks().Expand(UINT32_C(100)); |
| 326 const base::TimeTicks kEventTimestamp = receiver_clock_->NowTicks(); | 345 const base::TimeTicks kEventTimestamp = receiver_clock_->NowTicks(); |
| 327 const base::TimeDelta kDelayDelta = base::TimeDelta::FromMilliseconds(100); | 346 const base::TimeDelta kDelayDelta = base::TimeDelta::FromMilliseconds(100); |
| 328 | 347 |
| 329 RtcpEvent event; | 348 RtcpEvent event; |
| 330 event.type = FRAME_ACK_SENT; | 349 event.type = FRAME_ACK_SENT; |
| 331 event.timestamp = kEventTimestamp; | 350 event.timestamp = kEventTimestamp; |
| 332 event.delay_delta = kDelayDelta; | 351 event.delay_delta = kDelayDelta; |
| 333 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; | 352 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; |
| 334 rtcp_events.push_back(std::make_pair(kRtpTimeStamp, event)); | 353 rtcp_events.push_back(std::make_pair(kRtpTimeStamp, event)); |
| 335 | 354 |
| 336 rtp_receiver_pacer_.SendRtcpPacket( | 355 rtp_receiver_pacer_.SendRtcpPacket( |
| 337 rtcp_at_rtp_receiver_.local_ssrc(), | 356 rtcp_at_rtp_receiver_.local_ssrc(), |
| 338 BuildRtcpPacketFromRtpReceiver( | 357 BuildRtcpPacketFromRtpReceiver( |
| 339 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, | 358 CreateRtcpTimeData(receiver_clock_->NowTicks()), nullptr, nullptr, |
| 340 base::TimeDelta(), &rtcp_events, nullptr)); | 359 base::TimeDelta(), &rtcp_events, nullptr)); |
| 341 | 360 |
| 342 ASSERT_EQ(1UL, last_logs_.size()); | 361 ASSERT_EQ(1UL, last_logs_.size()); |
| 343 RtcpReceiverFrameLogMessage frame_log = last_logs_.front(); | 362 RtcpReceiverFrameLogMessage frame_log = last_logs_.front(); |
| 344 EXPECT_EQ(frame_log.rtp_timestamp_, kRtpTimeStamp); | 363 EXPECT_EQ(frame_log.rtp_timestamp_, kRtpTimeStamp); |
| 345 | 364 |
| 346 ASSERT_EQ(1UL, frame_log.event_log_messages_.size()); | 365 ASSERT_EQ(1UL, frame_log.event_log_messages_.size()); |
| 347 RtcpReceiverEventLogMessage log_msg = frame_log.event_log_messages_.back(); | 366 RtcpReceiverEventLogMessage log_msg = frame_log.event_log_messages_.back(); |
| 348 EXPECT_EQ(log_msg.type, event.type); | 367 EXPECT_EQ(log_msg.type, event.type); |
| 349 EXPECT_EQ(log_msg.delay_delta, event.delay_delta); | 368 EXPECT_EQ(log_msg.delay_delta, event.delay_delta); |
| 350 // Only 24 bits of event timestamp sent on wire. | 369 // Only 24 bits of event timestamp sent on wire. |
| 351 uint32_t event_ts = | 370 uint32_t event_ts = |
| 352 (event.timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; | 371 (event.timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; |
| 353 uint32_t log_msg_ts = | 372 uint32_t log_msg_ts = |
| 354 (log_msg.event_timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; | 373 (log_msg.event_timestamp - base::TimeTicks()).InMilliseconds() & 0xffffff; |
| 355 EXPECT_EQ(log_msg_ts, event_ts); | 374 EXPECT_EQ(log_msg_ts, event_ts); |
| 356 } | 375 } |
| 357 | 376 |
| 358 } // namespace cast | 377 } // namespace cast |
| 359 } // namespace media | 378 } // namespace media |
| OLD | NEW |