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

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: Rebased and addressed 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
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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698