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 |