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 "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 #include "base/test/simple_test_tick_clock.h" | 6 #include "base/test/simple_test_tick_clock.h" |
7 #include "media/cast/cast_environment.h" | 7 #include "media/cast/cast_environment.h" |
8 #include "media/cast/net/cast_transport_config.h" | 8 #include "media/cast/net/cast_transport_config.h" |
9 #include "media/cast/net/cast_transport_defines.h" | 9 #include "media/cast/net/cast_transport_defines.h" |
10 #include "media/cast/net/pacing/paced_sender.h" | 10 #include "media/cast/net/pacing/paced_sender.h" |
11 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" | 11 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" |
12 #include "media/cast/net/rtcp/rtcp_builder.h" | 12 #include "media/cast/net/rtcp/rtcp_builder.h" |
13 #include "media/cast/net/rtcp/rtcp_utility.h" | 13 #include "media/cast/net/rtcp/rtcp_utility.h" |
14 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" | 14 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 | 16 |
17 namespace media { | 17 namespace media { |
18 namespace cast { | 18 namespace cast { |
19 | 19 |
20 namespace { | 20 namespace { |
21 static const uint32 kSendingSsrc = 0x12345678; | 21 static const uint32_t kSendingSsrc = 0x12345678; |
22 static const uint32 kMediaSsrc = 0x87654321; | 22 static const uint32_t kMediaSsrc = 0x87654321; |
23 static const base::TimeDelta kDefaultDelay = | 23 static const base::TimeDelta kDefaultDelay = |
24 base::TimeDelta::FromMilliseconds(100); | 24 base::TimeDelta::FromMilliseconds(100); |
25 | 25 |
26 RtcpReportBlock GetReportBlock() { | 26 RtcpReportBlock GetReportBlock() { |
27 RtcpReportBlock report_block; | 27 RtcpReportBlock report_block; |
28 // Initialize remote_ssrc to a "clearly illegal" value. | 28 // Initialize remote_ssrc to a "clearly illegal" value. |
29 report_block.remote_ssrc = 0xDEAD; | 29 report_block.remote_ssrc = 0xDEAD; |
30 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. | 30 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
31 report_block.fraction_lost = kLoss >> 24; | 31 report_block.fraction_lost = kLoss >> 24; |
32 report_block.cumulative_lost = kLoss; // 24 bits valid. | 32 report_block.cumulative_lost = kLoss; // 24 bits valid. |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 ExpectPacketEQ(p.GetPacket().Pass(), | 160 ExpectPacketEQ(p.GetPacket().Pass(), |
161 rtcp_builder_->BuildRtcpFromReceiver( | 161 rtcp_builder_->BuildRtcpFromReceiver( |
162 &report_block, | 162 &report_block, |
163 &rrtr, | 163 &rrtr, |
164 &cast_message, | 164 &cast_message, |
165 NULL, | 165 NULL, |
166 kDefaultDelay)); | 166 kDefaultDelay)); |
167 } | 167 } |
168 | 168 |
169 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { | 169 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { |
170 static const uint32 kTimeBaseMs = 12345678; | 170 static const uint32_t kTimeBaseMs = 12345678; |
171 static const uint32 kTimeDelayMs = 10; | 171 static const uint32_t kTimeDelayMs = 10; |
172 | 172 |
173 TestRtcpPacketBuilder p; | 173 TestRtcpPacketBuilder p; |
174 p.AddRr(kSendingSsrc, 1); | 174 p.AddRr(kSendingSsrc, 1); |
175 p.AddRb(kMediaSsrc); | 175 p.AddRb(kMediaSsrc); |
176 p.AddXrHeader(kSendingSsrc); | 176 p.AddXrHeader(kSendingSsrc); |
177 p.AddXrRrtrBlock(); | 177 p.AddXrRrtrBlock(); |
178 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); | 178 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); |
179 | 179 |
180 RtcpReportBlock report_block = GetReportBlock(); | 180 RtcpReportBlock report_block = GetReportBlock(); |
181 | 181 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 p.GetPacket().Pass(), | 235 p.GetPacket().Pass(), |
236 rtcp_builder_->BuildRtcpFromReceiver( | 236 rtcp_builder_->BuildRtcpFromReceiver( |
237 &report_block, | 237 &report_block, |
238 &rrtr, | 238 &rrtr, |
239 &cast_message, | 239 &cast_message, |
240 &rtcp_events, | 240 &rtcp_events, |
241 kDefaultDelay)); | 241 kDefaultDelay)); |
242 } | 242 } |
243 | 243 |
244 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOversizedFrameLog) { | 244 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOversizedFrameLog) { |
245 static const uint32 kTimeBaseMs = 12345678; | 245 static const uint32_t kTimeBaseMs = 12345678; |
246 static const uint32 kTimeDelayMs = 10; | 246 static const uint32_t kTimeDelayMs = 10; |
247 | 247 |
248 TestRtcpPacketBuilder p; | 248 TestRtcpPacketBuilder p; |
249 p.AddRr(kSendingSsrc, 1); | 249 p.AddRr(kSendingSsrc, 1); |
250 p.AddRb(kMediaSsrc); | 250 p.AddRb(kMediaSsrc); |
251 | 251 |
252 RtcpReportBlock report_block = GetReportBlock(); | 252 RtcpReportBlock report_block = GetReportBlock(); |
253 | 253 |
254 base::SimpleTestTickClock testing_clock; | 254 base::SimpleTestTickClock testing_clock; |
255 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 255 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
256 | 256 |
257 p.AddReceiverLog(kSendingSsrc); | 257 p.AddReceiverLog(kSendingSsrc); |
258 | 258 |
259 int num_events = kMaxEventsPerRTCP; | 259 int num_events = kMaxEventsPerRTCP; |
260 | 260 |
261 EXPECT_LE(num_events, static_cast<int>(kRtcpMaxReceiverLogMessages)); | 261 EXPECT_LE(num_events, static_cast<int>(kRtcpMaxReceiverLogMessages)); |
262 p.AddReceiverFrameLog( | 262 p.AddReceiverFrameLog( |
263 kRtpTimestamp + 2345, | 263 kRtpTimestamp + 2345, |
264 num_events, | 264 num_events, |
265 kTimeBaseMs); | 265 kTimeBaseMs); |
266 for (int i = 0; i < num_events; i++) { | 266 for (int i = 0; i < num_events; i++) { |
267 p.AddReceiverEventLog( | 267 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, |
268 kLostPacketId1, | 268 static_cast<uint16_t>(kTimeDelayMs * i)); |
269 PACKET_RECEIVED, | |
270 static_cast<uint16>(kTimeDelayMs * i)); | |
271 } | 269 } |
272 | 270 |
273 | 271 |
274 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | 272 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); |
275 | 273 |
276 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { | 274 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { |
277 PacketEvent packet_event; | 275 PacketEvent packet_event; |
278 packet_event.rtp_timestamp = kRtpTimestamp + 2345; | 276 packet_event.rtp_timestamp = kRtpTimestamp + 2345; |
279 packet_event.type = PACKET_RECEIVED; | 277 packet_event.type = PACKET_RECEIVED; |
280 packet_event.media_type = VIDEO_EVENT; | 278 packet_event.media_type = VIDEO_EVENT; |
281 packet_event.timestamp = testing_clock.NowTicks(); | 279 packet_event.timestamp = testing_clock.NowTicks(); |
282 packet_event.packet_id = kLostPacketId1; | 280 packet_event.packet_id = kLostPacketId1; |
283 event_subscriber.OnReceivePacketEvent(packet_event); | 281 event_subscriber.OnReceivePacketEvent(packet_event); |
284 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 282 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
285 } | 283 } |
286 | 284 |
287 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; | 285 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; |
288 event_subscriber.GetRtcpEventsWithRedundancy(&rtcp_events); | 286 event_subscriber.GetRtcpEventsWithRedundancy(&rtcp_events); |
289 | 287 |
290 ExpectPacketEQ(p.GetPacket().Pass(), | 288 ExpectPacketEQ(p.GetPacket().Pass(), |
291 rtcp_builder_->BuildRtcpFromReceiver( | 289 rtcp_builder_->BuildRtcpFromReceiver( |
292 &report_block, | 290 &report_block, |
293 NULL, | 291 NULL, |
294 NULL, | 292 NULL, |
295 &rtcp_events, | 293 &rtcp_events, |
296 kDefaultDelay)); | 294 kDefaultDelay)); |
297 } | 295 } |
298 | 296 |
299 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithTooManyLogFrames) { | 297 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithTooManyLogFrames) { |
300 static const uint32 kTimeBaseMs = 12345678; | 298 static const uint32_t kTimeBaseMs = 12345678; |
301 static const uint32 kTimeDelayMs = 10; | 299 static const uint32_t kTimeDelayMs = 10; |
302 | 300 |
303 TestRtcpPacketBuilder p; | 301 TestRtcpPacketBuilder p; |
304 p.AddRr(kSendingSsrc, 1); | 302 p.AddRr(kSendingSsrc, 1); |
305 p.AddRb(kMediaSsrc); | 303 p.AddRb(kMediaSsrc); |
306 | 304 |
307 RtcpReportBlock report_block = GetReportBlock(); | 305 RtcpReportBlock report_block = GetReportBlock(); |
308 | 306 |
309 base::SimpleTestTickClock testing_clock; | 307 base::SimpleTestTickClock testing_clock; |
310 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 308 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
311 | 309 |
(...skipping 24 matching lines...) Expand all Loading... |
336 ExpectPacketEQ(p.GetPacket().Pass(), | 334 ExpectPacketEQ(p.GetPacket().Pass(), |
337 rtcp_builder_->BuildRtcpFromReceiver( | 335 rtcp_builder_->BuildRtcpFromReceiver( |
338 &report_block, | 336 &report_block, |
339 NULL, | 337 NULL, |
340 NULL, | 338 NULL, |
341 &rtcp_events, | 339 &rtcp_events, |
342 kDefaultDelay)); | 340 kDefaultDelay)); |
343 } | 341 } |
344 | 342 |
345 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOldLogFrames) { | 343 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOldLogFrames) { |
346 static const uint32 kTimeBaseMs = 12345678; | 344 static const uint32_t kTimeBaseMs = 12345678; |
347 | 345 |
348 TestRtcpPacketBuilder p; | 346 TestRtcpPacketBuilder p; |
349 p.AddRr(kSendingSsrc, 1); | 347 p.AddRr(kSendingSsrc, 1); |
350 p.AddRb(kMediaSsrc); | 348 p.AddRb(kMediaSsrc); |
351 | 349 |
352 RtcpReportBlock report_block = GetReportBlock(); | 350 RtcpReportBlock report_block = GetReportBlock(); |
353 | 351 |
354 base::SimpleTestTickClock testing_clock; | 352 base::SimpleTestTickClock testing_clock; |
355 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 353 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
356 | 354 |
(...skipping 26 matching lines...) Expand all Loading... |
383 ExpectPacketEQ(p.GetPacket().Pass(), | 381 ExpectPacketEQ(p.GetPacket().Pass(), |
384 rtcp_builder_->BuildRtcpFromReceiver( | 382 rtcp_builder_->BuildRtcpFromReceiver( |
385 &report_block, | 383 &report_block, |
386 NULL, | 384 NULL, |
387 NULL, | 385 NULL, |
388 &rtcp_events, | 386 &rtcp_events, |
389 kDefaultDelay)); | 387 kDefaultDelay)); |
390 } | 388 } |
391 | 389 |
392 TEST_F(RtcpBuilderTest, RtcpReceiverReportRedundancy) { | 390 TEST_F(RtcpBuilderTest, RtcpReceiverReportRedundancy) { |
393 uint32 time_base_ms = 12345678; | 391 uint32_t time_base_ms = 12345678; |
394 int kTimeBetweenEventsMs = 10; | 392 int kTimeBetweenEventsMs = 10; |
395 | 393 |
396 RtcpReportBlock report_block = GetReportBlock(); | 394 RtcpReportBlock report_block = GetReportBlock(); |
397 | 395 |
398 base::SimpleTestTickClock testing_clock; | 396 base::SimpleTestTickClock testing_clock; |
399 testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms)); | 397 testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms)); |
400 | 398 |
401 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | 399 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); |
402 size_t packet_count = kNumResends * kResendDelay + 10; | 400 size_t packet_count = kNumResends * kResendDelay + 10; |
403 for (size_t i = 0; i < packet_count; i++) { | 401 for (size_t i = 0; i < packet_count; i++) { |
404 TestRtcpPacketBuilder p; | 402 TestRtcpPacketBuilder p; |
405 p.AddRr(kSendingSsrc, 1); | 403 p.AddRr(kSendingSsrc, 1); |
406 p.AddRb(kMediaSsrc); | 404 p.AddRb(kMediaSsrc); |
407 | 405 |
408 p.AddReceiverLog(kSendingSsrc); | 406 p.AddReceiverLog(kSendingSsrc); |
409 | 407 |
410 int num_events = (i + kResendDelay) / kResendDelay; | 408 int num_events = (i + kResendDelay) / kResendDelay; |
411 num_events = std::min<int>(num_events, kNumResends); | 409 num_events = std::min<int>(num_events, kNumResends); |
412 p.AddReceiverFrameLog(kRtpTimestamp, num_events, | 410 p.AddReceiverFrameLog(kRtpTimestamp, num_events, |
413 time_base_ms - (num_events - 1) * kResendDelay * | 411 time_base_ms - (num_events - 1) * kResendDelay * |
414 kTimeBetweenEventsMs); | 412 kTimeBetweenEventsMs); |
415 for (int i = 0; i < num_events; i++) { | 413 for (int i = 0; i < num_events; i++) { |
416 p.AddReceiverEventLog( | 414 p.AddReceiverEventLog(0, FRAME_ACK_SENT, |
417 0, FRAME_ACK_SENT, | 415 base::checked_cast<uint16_t>(i * kResendDelay * |
418 base::checked_cast<uint16>(i * kResendDelay * kTimeBetweenEventsMs)); | 416 kTimeBetweenEventsMs)); |
419 } | 417 } |
420 | 418 |
421 FrameEvent frame_event; | 419 FrameEvent frame_event; |
422 frame_event.rtp_timestamp = kRtpTimestamp; | 420 frame_event.rtp_timestamp = kRtpTimestamp; |
423 frame_event.type = FRAME_ACK_SENT; | 421 frame_event.type = FRAME_ACK_SENT; |
424 frame_event.media_type = VIDEO_EVENT; | 422 frame_event.media_type = VIDEO_EVENT; |
425 frame_event.timestamp = testing_clock.NowTicks(); | 423 frame_event.timestamp = testing_clock.NowTicks(); |
426 event_subscriber.OnReceiveFrameEvent(frame_event); | 424 event_subscriber.OnReceiveFrameEvent(frame_event); |
427 | 425 |
428 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; | 426 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; |
(...skipping 24 matching lines...) Expand all Loading... |
453 // Sender report. | 451 // Sender report. |
454 TestRtcpPacketBuilder p; | 452 TestRtcpPacketBuilder p; |
455 p.AddSr(kSendingSsrc, 0); | 453 p.AddSr(kSendingSsrc, 0); |
456 | 454 |
457 ExpectPacketEQ(p.GetPacket().Pass(), | 455 ExpectPacketEQ(p.GetPacket().Pass(), |
458 rtcp_builder_->BuildRtcpFromSender(sender_info)); | 456 rtcp_builder_->BuildRtcpFromSender(sender_info)); |
459 } | 457 } |
460 | 458 |
461 } // namespace cast | 459 } // namespace cast |
462 } // namespace media | 460 } // namespace media |
OLD | NEW |