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 |