Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(182)

Side by Side Diff: media/cast/net/rtcp/rtcp_unittest.cc

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address dcheng's comments. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/cast/net/rtcp/rtcp_defines.cc ('k') | media/cast/net/rtcp/rtcp_utility.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/cast/net/rtcp/rtcp_defines.cc ('k') | media/cast/net/rtcp/rtcp_utility.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698