OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/memory/scoped_ptr.h" | |
6 #include "base/test/simple_test_tick_clock.h" | |
7 #include "media/cast/cast_defines.h" | |
8 #include "media/cast/cast_environment.h" | |
9 #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" | |
10 #include "media/cast/rtcp/rtcp_sender.h" | |
11 #include "media/cast/rtcp/rtcp_utility.h" | |
12 #include "media/cast/rtcp/test_rtcp_packet_builder.h" | |
13 #include "media/cast/test/fake_single_thread_task_runner.h" | |
14 #include "media/cast/transport/cast_transport_defines.h" | |
15 #include "media/cast/transport/pacing/paced_sender.h" | |
16 #include "testing/gmock/include/gmock/gmock.h" | |
17 | |
18 namespace media { | |
19 namespace cast { | |
20 | |
21 namespace { | |
22 static const uint32 kSendingSsrc = 0x12345678; | |
23 static const uint32 kMediaSsrc = 0x87654321; | |
24 static const base::TimeDelta kDefaultDelay = | |
25 base::TimeDelta::FromMilliseconds(100); | |
26 static const std::string kCName("test@10.1.1.1"); | |
27 | |
28 transport::RtcpReportBlock GetReportBlock() { | |
29 transport::RtcpReportBlock report_block; | |
30 // Initialize remote_ssrc to a "clearly illegal" value. | |
31 report_block.remote_ssrc = 0xDEAD; | |
32 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. | |
33 report_block.fraction_lost = kLoss >> 24; | |
34 report_block.cumulative_lost = kLoss; // 24 bits valid. | |
35 report_block.extended_high_sequence_number = kExtendedMax; | |
36 report_block.jitter = kTestJitter; | |
37 report_block.last_sr = kLastSr; | |
38 report_block.delay_since_last_sr = kDelayLastSr; | |
39 return report_block; | |
40 } | |
41 | |
42 } // namespace | |
43 | |
44 class TestRtcpTransport : public transport::PacedPacketSender { | |
45 public: | |
46 TestRtcpTransport() : packet_count_(0) {} | |
47 | |
48 virtual bool SendRtcpPacket(uint32 ssrc, | |
49 transport::PacketRef packet) OVERRIDE { | |
50 EXPECT_EQ(expected_packet_.size(), packet->data.size()); | |
51 EXPECT_EQ(0, memcmp(expected_packet_.data(), | |
52 packet->data.data(), | |
53 packet->data.size())); | |
54 packet_count_++; | |
55 return true; | |
56 } | |
57 | |
58 virtual bool SendPackets( | |
59 const transport::SendPacketVector& packets) OVERRIDE { | |
60 return false; | |
61 } | |
62 virtual bool ResendPackets( | |
63 const transport::SendPacketVector& packets, | |
64 base::TimeDelta dedupe_window) OVERRIDE { | |
65 return false; | |
66 } | |
67 | |
68 virtual void CancelSendingPacket( | |
69 const transport::PacketKey& packet_key) OVERRIDE { | |
70 } | |
71 | |
72 void SetExpectedRtcpPacket(scoped_ptr<Packet> packet) { | |
73 expected_packet_.swap(*packet); | |
74 } | |
75 | |
76 int packet_count() const { return packet_count_; } | |
77 | |
78 private: | |
79 Packet expected_packet_; | |
80 int packet_count_; | |
81 | |
82 DISALLOW_COPY_AND_ASSIGN(TestRtcpTransport); | |
83 }; | |
84 | |
85 class RtcpSenderTest : public ::testing::Test { | |
86 protected: | |
87 RtcpSenderTest() | |
88 : testing_clock_(new base::SimpleTestTickClock()), | |
89 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | |
90 cast_environment_(new CastEnvironment( | |
91 scoped_ptr<base::TickClock>(testing_clock_).Pass(), | |
92 task_runner_, | |
93 task_runner_, | |
94 task_runner_)), | |
95 rtcp_sender_(new RtcpSender(cast_environment_, | |
96 &test_transport_, | |
97 kSendingSsrc, | |
98 kCName)) {} | |
99 | |
100 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | |
101 TestRtcpTransport test_transport_; | |
102 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | |
103 scoped_refptr<CastEnvironment> cast_environment_; | |
104 scoped_ptr<RtcpSender> rtcp_sender_; | |
105 | |
106 DISALLOW_COPY_AND_ASSIGN(RtcpSenderTest); | |
107 }; | |
108 | |
109 TEST_F(RtcpSenderTest, RtcpReceiverReport) { | |
110 // Empty receiver report + c_name. | |
111 TestRtcpPacketBuilder p1; | |
112 p1.AddRr(kSendingSsrc, 0); | |
113 p1.AddSdesCname(kSendingSsrc, kCName); | |
114 test_transport_.SetExpectedRtcpPacket(p1.GetPacket()); | |
115 | |
116 rtcp_sender_->SendRtcpFromRtpReceiver( | |
117 transport::kRtcpRr, NULL, NULL, NULL, NULL, kDefaultDelay); | |
118 | |
119 EXPECT_EQ(1, test_transport_.packet_count()); | |
120 | |
121 // Receiver report with report block + c_name. | |
122 TestRtcpPacketBuilder p2; | |
123 p2.AddRr(kSendingSsrc, 1); | |
124 p2.AddRb(kMediaSsrc); | |
125 p2.AddSdesCname(kSendingSsrc, kCName); | |
126 test_transport_.SetExpectedRtcpPacket(p2.GetPacket().Pass()); | |
127 | |
128 transport::RtcpReportBlock report_block = GetReportBlock(); | |
129 | |
130 rtcp_sender_->SendRtcpFromRtpReceiver( | |
131 transport::kRtcpRr, &report_block, NULL, NULL, NULL, kDefaultDelay); | |
132 | |
133 EXPECT_EQ(2, test_transport_.packet_count()); | |
134 } | |
135 | |
136 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) { | |
137 // Receiver report with report block + c_name. | |
138 TestRtcpPacketBuilder p; | |
139 p.AddRr(kSendingSsrc, 1); | |
140 p.AddRb(kMediaSsrc); | |
141 p.AddSdesCname(kSendingSsrc, kCName); | |
142 p.AddXrHeader(kSendingSsrc); | |
143 p.AddXrRrtrBlock(); | |
144 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
145 | |
146 transport::RtcpReportBlock report_block = GetReportBlock(); | |
147 | |
148 RtcpReceiverReferenceTimeReport rrtr; | |
149 rrtr.ntp_seconds = kNtpHigh; | |
150 rrtr.ntp_fraction = kNtpLow; | |
151 | |
152 rtcp_sender_->SendRtcpFromRtpReceiver( | |
153 transport::kRtcpRr | transport::kRtcpRrtr, | |
154 &report_block, | |
155 &rrtr, | |
156 NULL, | |
157 NULL, | |
158 kDefaultDelay); | |
159 | |
160 EXPECT_EQ(1, test_transport_.packet_count()); | |
161 } | |
162 | |
163 TEST_F(RtcpSenderTest, RtcpReceiverReportWithCast) { | |
164 // Receiver report with report block + c_name. | |
165 TestRtcpPacketBuilder p; | |
166 p.AddRr(kSendingSsrc, 1); | |
167 p.AddRb(kMediaSsrc); | |
168 p.AddSdesCname(kSendingSsrc, kCName); | |
169 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); | |
170 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
171 | |
172 transport::RtcpReportBlock report_block = GetReportBlock(); | |
173 | |
174 RtcpCastMessage cast_message(kMediaSsrc); | |
175 cast_message.ack_frame_id_ = kAckFrameId; | |
176 PacketIdSet missing_packets; | |
177 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; | |
178 | |
179 missing_packets.insert(kLostPacketId1); | |
180 missing_packets.insert(kLostPacketId2); | |
181 missing_packets.insert(kLostPacketId3); | |
182 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = | |
183 missing_packets; | |
184 | |
185 rtcp_sender_->SendRtcpFromRtpReceiver( | |
186 transport::kRtcpRr | transport::kRtcpCast, | |
187 &report_block, | |
188 NULL, | |
189 &cast_message, | |
190 NULL, | |
191 kDefaultDelay); | |
192 | |
193 EXPECT_EQ(1, test_transport_.packet_count()); | |
194 } | |
195 | |
196 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) { | |
197 TestRtcpPacketBuilder p; | |
198 p.AddRr(kSendingSsrc, 1); | |
199 p.AddRb(kMediaSsrc); | |
200 p.AddSdesCname(kSendingSsrc, kCName); | |
201 p.AddXrHeader(kSendingSsrc); | |
202 p.AddXrRrtrBlock(); | |
203 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); | |
204 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
205 | |
206 transport::RtcpReportBlock report_block = GetReportBlock(); | |
207 | |
208 RtcpReceiverReferenceTimeReport rrtr; | |
209 rrtr.ntp_seconds = kNtpHigh; | |
210 rrtr.ntp_fraction = kNtpLow; | |
211 | |
212 RtcpCastMessage cast_message(kMediaSsrc); | |
213 cast_message.ack_frame_id_ = kAckFrameId; | |
214 PacketIdSet missing_packets; | |
215 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; | |
216 | |
217 missing_packets.insert(kLostPacketId1); | |
218 missing_packets.insert(kLostPacketId2); | |
219 missing_packets.insert(kLostPacketId3); | |
220 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = | |
221 missing_packets; | |
222 | |
223 rtcp_sender_->SendRtcpFromRtpReceiver( | |
224 transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast, | |
225 &report_block, | |
226 &rrtr, | |
227 &cast_message, | |
228 NULL, | |
229 kDefaultDelay); | |
230 | |
231 EXPECT_EQ(1, test_transport_.packet_count()); | |
232 } | |
233 | |
234 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { | |
235 static const uint32 kTimeBaseMs = 12345678; | |
236 static const uint32 kTimeDelayMs = 10; | |
237 | |
238 TestRtcpPacketBuilder p; | |
239 p.AddRr(kSendingSsrc, 1); | |
240 p.AddRb(kMediaSsrc); | |
241 p.AddSdesCname(kSendingSsrc, kCName); | |
242 p.AddXrHeader(kSendingSsrc); | |
243 p.AddXrRrtrBlock(); | |
244 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); | |
245 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
246 | |
247 transport::RtcpReportBlock report_block = GetReportBlock(); | |
248 | |
249 RtcpReceiverReferenceTimeReport rrtr; | |
250 rrtr.ntp_seconds = kNtpHigh; | |
251 rrtr.ntp_fraction = kNtpLow; | |
252 | |
253 RtcpCastMessage cast_message(kMediaSsrc); | |
254 cast_message.ack_frame_id_ = kAckFrameId; | |
255 PacketIdSet missing_packets; | |
256 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; | |
257 | |
258 missing_packets.insert(kLostPacketId1); | |
259 missing_packets.insert(kLostPacketId2); | |
260 missing_packets.insert(kLostPacketId3); | |
261 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = | |
262 missing_packets; | |
263 | |
264 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | |
265 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | |
266 | |
267 rtcp_sender_->SendRtcpFromRtpReceiver( | |
268 transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast | | |
269 transport::kRtcpReceiverLog, | |
270 &report_block, | |
271 &rrtr, | |
272 &cast_message, | |
273 &rtcp_events, | |
274 kDefaultDelay); | |
275 | |
276 base::SimpleTestTickClock testing_clock; | |
277 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | |
278 | |
279 p.AddReceiverLog(kSendingSsrc); | |
280 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs); | |
281 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | |
282 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); | |
283 | |
284 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
285 | |
286 FrameEvent frame_event; | |
287 frame_event.rtp_timestamp = kRtpTimestamp; | |
288 frame_event.type = FRAME_ACK_SENT; | |
289 frame_event.media_type = VIDEO_EVENT; | |
290 frame_event.timestamp = testing_clock.NowTicks(); | |
291 event_subscriber.OnReceiveFrameEvent(frame_event); | |
292 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | |
293 | |
294 PacketEvent packet_event; | |
295 packet_event.rtp_timestamp = kRtpTimestamp; | |
296 packet_event.type = PACKET_RECEIVED; | |
297 packet_event.media_type = VIDEO_EVENT; | |
298 packet_event.timestamp = testing_clock.NowTicks(); | |
299 packet_event.packet_id = kLostPacketId1; | |
300 event_subscriber.OnReceivePacketEvent(packet_event); | |
301 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | |
302 EXPECT_EQ(2u, rtcp_events.size()); | |
303 | |
304 rtcp_sender_->SendRtcpFromRtpReceiver( | |
305 transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast | | |
306 transport::kRtcpReceiverLog, | |
307 &report_block, | |
308 &rrtr, | |
309 &cast_message, | |
310 &rtcp_events, | |
311 kDefaultDelay); | |
312 | |
313 EXPECT_EQ(2, test_transport_.packet_count()); | |
314 } | |
315 | |
316 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { | |
317 static const uint32 kTimeBaseMs = 12345678; | |
318 static const uint32 kTimeDelayMs = 10; | |
319 | |
320 TestRtcpPacketBuilder p; | |
321 p.AddRr(kSendingSsrc, 1); | |
322 p.AddRb(kMediaSsrc); | |
323 p.AddSdesCname(kSendingSsrc, kCName); | |
324 | |
325 transport::RtcpReportBlock report_block = GetReportBlock(); | |
326 | |
327 base::SimpleTestTickClock testing_clock; | |
328 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | |
329 | |
330 p.AddReceiverLog(kSendingSsrc); | |
331 | |
332 int remaining_bytes = kMaxReceiverLogBytes; | |
333 remaining_bytes -= kRtcpCastLogHeaderSize; | |
334 | |
335 remaining_bytes -= kRtcpReceiverFrameLogSize; | |
336 int num_events = remaining_bytes / kRtcpReceiverEventLogSize; | |
337 EXPECT_LE(num_events, static_cast<int>(kRtcpMaxReceiverLogMessages)); | |
338 // Only the last |num_events| events are sent due to receiver log size cap. | |
339 p.AddReceiverFrameLog( | |
340 kRtpTimestamp + 2345, | |
341 num_events, | |
342 kTimeBaseMs + (kRtcpMaxReceiverLogMessages - num_events) * kTimeDelayMs); | |
343 for (int i = 0; i < num_events; i++) { | |
344 p.AddReceiverEventLog( | |
345 kLostPacketId1, PACKET_RECEIVED, | |
346 static_cast<uint16>(kTimeDelayMs * i)); | |
347 } | |
348 | |
349 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
350 | |
351 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | |
352 FrameEvent frame_event; | |
353 frame_event.rtp_timestamp = kRtpTimestamp; | |
354 frame_event.type = FRAME_ACK_SENT; | |
355 frame_event.media_type = VIDEO_EVENT; | |
356 frame_event.timestamp = testing_clock.NowTicks(); | |
357 event_subscriber.OnReceiveFrameEvent(frame_event); | |
358 | |
359 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { | |
360 PacketEvent packet_event; | |
361 packet_event.rtp_timestamp = kRtpTimestamp + 2345; | |
362 packet_event.type = PACKET_RECEIVED; | |
363 packet_event.media_type = VIDEO_EVENT; | |
364 packet_event.timestamp = testing_clock.NowTicks(); | |
365 packet_event.packet_id = kLostPacketId1; | |
366 event_subscriber.OnReceivePacketEvent(packet_event); | |
367 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | |
368 } | |
369 | |
370 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | |
371 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | |
372 | |
373 rtcp_sender_->SendRtcpFromRtpReceiver( | |
374 transport::kRtcpRr | transport::kRtcpReceiverLog, | |
375 &report_block, | |
376 NULL, | |
377 NULL, | |
378 &rtcp_events, | |
379 kDefaultDelay); | |
380 | |
381 EXPECT_EQ(1, test_transport_.packet_count()); | |
382 } | |
383 | |
384 TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { | |
385 static const uint32 kTimeBaseMs = 12345678; | |
386 static const uint32 kTimeDelayMs = 10; | |
387 | |
388 TestRtcpPacketBuilder p; | |
389 p.AddRr(kSendingSsrc, 1); | |
390 p.AddRb(kMediaSsrc); | |
391 p.AddSdesCname(kSendingSsrc, kCName); | |
392 | |
393 transport::RtcpReportBlock report_block = GetReportBlock(); | |
394 | |
395 base::SimpleTestTickClock testing_clock; | |
396 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | |
397 | |
398 p.AddReceiverLog(kSendingSsrc); | |
399 | |
400 int remaining_bytes = kMaxReceiverLogBytes; | |
401 remaining_bytes -= kRtcpCastLogHeaderSize; | |
402 | |
403 int num_events = | |
404 remaining_bytes / (kRtcpReceiverFrameLogSize + kRtcpReceiverEventLogSize); | |
405 | |
406 // The last |num_events| events are sent due to receiver log size cap. | |
407 for (size_t i = kRtcpMaxReceiverLogMessages - num_events; | |
408 i < kRtcpMaxReceiverLogMessages; | |
409 ++i) { | |
410 p.AddReceiverFrameLog(kRtpTimestamp + i, 1, kTimeBaseMs + i * kTimeDelayMs); | |
411 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | |
412 } | |
413 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
414 | |
415 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | |
416 | |
417 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { | |
418 FrameEvent frame_event; | |
419 frame_event.rtp_timestamp = kRtpTimestamp + static_cast<int>(i); | |
420 frame_event.type = FRAME_ACK_SENT; | |
421 frame_event.media_type = VIDEO_EVENT; | |
422 frame_event.timestamp = testing_clock.NowTicks(); | |
423 event_subscriber.OnReceiveFrameEvent(frame_event); | |
424 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | |
425 } | |
426 | |
427 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | |
428 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | |
429 | |
430 rtcp_sender_->SendRtcpFromRtpReceiver( | |
431 transport::kRtcpRr | transport::kRtcpReceiverLog, | |
432 &report_block, | |
433 NULL, | |
434 NULL, | |
435 &rtcp_events, | |
436 kDefaultDelay); | |
437 | |
438 EXPECT_EQ(1, test_transport_.packet_count()); | |
439 } | |
440 | |
441 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { | |
442 static const uint32 kTimeBaseMs = 12345678; | |
443 | |
444 TestRtcpPacketBuilder p; | |
445 p.AddRr(kSendingSsrc, 1); | |
446 p.AddRb(kMediaSsrc); | |
447 p.AddSdesCname(kSendingSsrc, kCName); | |
448 | |
449 transport::RtcpReportBlock report_block = GetReportBlock(); | |
450 | |
451 base::SimpleTestTickClock testing_clock; | |
452 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | |
453 | |
454 p.AddReceiverLog(kSendingSsrc); | |
455 | |
456 // Log 11 events for a single frame, each |kTimeBetweenEventsMs| apart. | |
457 // Only last 10 events will be sent because the first event is more than | |
458 // 4095 milliseconds away from latest event. | |
459 const int kTimeBetweenEventsMs = 410; | |
460 p.AddReceiverFrameLog(kRtpTimestamp, 10, kTimeBaseMs + kTimeBetweenEventsMs); | |
461 for (int i = 0; i < 10; ++i) { | |
462 p.AddReceiverEventLog(0, FRAME_ACK_SENT, i * kTimeBetweenEventsMs); | |
463 } | |
464 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
465 | |
466 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | |
467 for (int i = 0; i < 11; ++i) { | |
468 FrameEvent frame_event; | |
469 frame_event.rtp_timestamp = kRtpTimestamp; | |
470 frame_event.type = FRAME_ACK_SENT; | |
471 frame_event.media_type = VIDEO_EVENT; | |
472 frame_event.timestamp = testing_clock.NowTicks(); | |
473 event_subscriber.OnReceiveFrameEvent(frame_event); | |
474 testing_clock.Advance( | |
475 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); | |
476 } | |
477 | |
478 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | |
479 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | |
480 | |
481 rtcp_sender_->SendRtcpFromRtpReceiver( | |
482 transport::kRtcpRr | transport::kRtcpReceiverLog, | |
483 &report_block, | |
484 NULL, | |
485 NULL, | |
486 &rtcp_events, | |
487 kDefaultDelay); | |
488 | |
489 EXPECT_EQ(1, test_transport_.packet_count()); | |
490 } | |
491 | |
492 TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { | |
493 uint32 time_base_ms = 12345678; | |
494 int kTimeBetweenEventsMs = 10; | |
495 | |
496 transport::RtcpReportBlock report_block = GetReportBlock(); | |
497 | |
498 base::SimpleTestTickClock testing_clock; | |
499 testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms)); | |
500 | |
501 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | |
502 size_t packet_count = kReceiveLogMessageHistorySize + 10; | |
503 for (size_t i = 0; i < packet_count; i++) { | |
504 TestRtcpPacketBuilder p; | |
505 p.AddRr(kSendingSsrc, 1); | |
506 p.AddRb(kMediaSsrc); | |
507 p.AddSdesCname(kSendingSsrc, kCName); | |
508 | |
509 p.AddReceiverLog(kSendingSsrc); | |
510 | |
511 if (i >= kSecondRedundancyOffset) { | |
512 p.AddReceiverFrameLog( | |
513 kRtpTimestamp, | |
514 1, | |
515 time_base_ms - kSecondRedundancyOffset * kTimeBetweenEventsMs); | |
516 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | |
517 } | |
518 if (i >= kFirstRedundancyOffset) { | |
519 p.AddReceiverFrameLog( | |
520 kRtpTimestamp, | |
521 1, | |
522 time_base_ms - kFirstRedundancyOffset * kTimeBetweenEventsMs); | |
523 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | |
524 } | |
525 p.AddReceiverFrameLog(kRtpTimestamp, 1, time_base_ms); | |
526 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | |
527 | |
528 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
529 | |
530 FrameEvent frame_event; | |
531 frame_event.rtp_timestamp = kRtpTimestamp; | |
532 frame_event.type = FRAME_ACK_SENT; | |
533 frame_event.media_type = VIDEO_EVENT; | |
534 frame_event.timestamp = testing_clock.NowTicks(); | |
535 event_subscriber.OnReceiveFrameEvent(frame_event); | |
536 | |
537 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | |
538 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | |
539 | |
540 rtcp_sender_->SendRtcpFromRtpReceiver( | |
541 transport::kRtcpRr | transport::kRtcpReceiverLog, | |
542 &report_block, | |
543 NULL, | |
544 NULL, | |
545 &rtcp_events, | |
546 kDefaultDelay); | |
547 | |
548 testing_clock.Advance( | |
549 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); | |
550 time_base_ms += kTimeBetweenEventsMs; | |
551 } | |
552 | |
553 EXPECT_EQ(static_cast<int>(packet_count), test_transport_.packet_count()); | |
554 } | |
555 | |
556 } // namespace cast | |
557 } // namespace media | |
OLD | NEW |