OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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_defines.h" | 7 #include "media/cast/cast_defines.h" |
8 #include "media/cast/cast_environment.h" | 8 #include "media/cast/cast_environment.h" |
| 9 #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" |
9 #include "media/cast/rtcp/rtcp_sender.h" | 10 #include "media/cast/rtcp/rtcp_sender.h" |
10 #include "media/cast/rtcp/rtcp_utility.h" | 11 #include "media/cast/rtcp/rtcp_utility.h" |
11 #include "media/cast/rtcp/test_rtcp_packet_builder.h" | 12 #include "media/cast/rtcp/test_rtcp_packet_builder.h" |
12 #include "media/cast/test/fake_single_thread_task_runner.h" | 13 #include "media/cast/test/fake_single_thread_task_runner.h" |
13 #include "media/cast/transport/cast_transport_defines.h" | 14 #include "media/cast/transport/cast_transport_defines.h" |
14 #include "media/cast/transport/pacing/paced_sender.h" | 15 #include "media/cast/transport/pacing/paced_sender.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
16 | 17 |
17 namespace media { | 18 namespace media { |
18 namespace cast { | 19 namespace cast { |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 &rrtr, | 236 &rrtr, |
236 &cast_message, | 237 &cast_message, |
237 NULL); | 238 NULL); |
238 | 239 |
239 EXPECT_EQ(1, test_transport_.packet_count()); | 240 EXPECT_EQ(1, test_transport_.packet_count()); |
240 } | 241 } |
241 | 242 |
242 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { | 243 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { |
243 static const uint32 kTimeBaseMs = 12345678; | 244 static const uint32 kTimeBaseMs = 12345678; |
244 static const uint32 kTimeDelayMs = 10; | 245 static const uint32 kTimeDelayMs = 10; |
245 static const uint32 kDelayDeltaMs = 123; | |
246 | 246 |
247 TestRtcpPacketBuilder p; | 247 TestRtcpPacketBuilder p; |
248 p.AddRr(kSendingSsrc, 1); | 248 p.AddRr(kSendingSsrc, 1); |
249 p.AddRb(kMediaSsrc); | 249 p.AddRb(kMediaSsrc); |
250 p.AddSdesCname(kSendingSsrc, kCName); | 250 p.AddSdesCname(kSendingSsrc, kCName); |
251 p.AddXrHeader(kSendingSsrc); | 251 p.AddXrHeader(kSendingSsrc); |
252 p.AddXrRrtrBlock(); | 252 p.AddXrRrtrBlock(); |
253 p.AddCast(kSendingSsrc, kMediaSsrc); | 253 p.AddCast(kSendingSsrc, kMediaSsrc); |
254 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | 254 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); |
255 | 255 |
(...skipping 16 matching lines...) Expand all Loading... |
272 cast_message.ack_frame_id_ = kAckFrameId; | 272 cast_message.ack_frame_id_ = kAckFrameId; |
273 PacketIdSet missing_packets; | 273 PacketIdSet missing_packets; |
274 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; | 274 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; |
275 | 275 |
276 missing_packets.insert(kLostPacketId1); | 276 missing_packets.insert(kLostPacketId1); |
277 missing_packets.insert(kLostPacketId2); | 277 missing_packets.insert(kLostPacketId2); |
278 missing_packets.insert(kLostPacketId3); | 278 missing_packets.insert(kLostPacketId3); |
279 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = | 279 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = |
280 missing_packets; | 280 missing_packets; |
281 | 281 |
282 // Test empty Log message. | 282 ReceiverRtcpEventSubscriber event_subscriber( |
283 RtcpReceiverLogMessage receiver_log; | 283 500, ReceiverRtcpEventSubscriber::kVideoEventSubscriber); |
284 | 284 |
285 rtcp_sender_->SendRtcpFromRtpReceiver( | 285 rtcp_sender_->SendRtcpFromRtpReceiver( |
286 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr | RtcpSender::kRtcpCast | | 286 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr | RtcpSender::kRtcpCast | |
287 RtcpSender::kRtcpReceiverLog, | 287 RtcpSender::kRtcpReceiverLog, |
288 &report_block, | 288 &report_block, |
289 &rrtr, | 289 &rrtr, |
290 &cast_message, | 290 &cast_message, |
291 &receiver_log); | 291 &event_subscriber); |
292 | 292 |
293 base::SimpleTestTickClock testing_clock; | 293 base::SimpleTestTickClock testing_clock; |
294 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 294 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
295 | 295 |
296 p.AddReceiverLog(kSendingSsrc); | 296 p.AddReceiverLog(kSendingSsrc); |
297 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs); | 297 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs); |
298 p.AddReceiverEventLog(kDelayDeltaMs, 5, 0); | 298 p.AddReceiverEventLog(0, 5, 0); |
299 p.AddReceiverEventLog(kLostPacketId1, 8, kTimeDelayMs); | 299 p.AddReceiverEventLog(kLostPacketId1, 8, kTimeDelayMs); |
300 | 300 |
301 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | 301 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); |
302 | 302 |
303 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); | 303 FrameEvent frame_event; |
304 RtcpReceiverEventLogMessage event_log; | 304 frame_event.rtp_timestamp = kRtpTimestamp; |
| 305 frame_event.type = kVideoAckSent; |
| 306 frame_event.timestamp = testing_clock.NowTicks(); |
| 307 event_subscriber.OnReceiveFrameEvent(frame_event); |
| 308 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
305 | 309 |
306 event_log.type = kVideoAckSent; | 310 PacketEvent packet_event; |
307 event_log.event_timestamp = testing_clock.NowTicks(); | 311 packet_event.rtp_timestamp = kRtpTimestamp; |
308 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); | 312 packet_event.type = kVideoPacketReceived; |
309 frame_log.event_log_messages_.push_back(event_log); | 313 packet_event.timestamp = testing_clock.NowTicks(); |
310 | 314 packet_event.packet_id = kLostPacketId1; |
311 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 315 event_subscriber.OnReceivePacketEvent(packet_event); |
312 event_log.type = kVideoPacketReceived; | |
313 event_log.event_timestamp = testing_clock.NowTicks(); | |
314 event_log.packet_id = kLostPacketId1; | |
315 frame_log.event_log_messages_.push_back(event_log); | |
316 | |
317 receiver_log.push_back(frame_log); | |
318 | 316 |
319 rtcp_sender_->SendRtcpFromRtpReceiver( | 317 rtcp_sender_->SendRtcpFromRtpReceiver( |
320 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr | RtcpSender::kRtcpCast | | 318 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr | RtcpSender::kRtcpCast | |
321 RtcpSender::kRtcpReceiverLog, | 319 RtcpSender::kRtcpReceiverLog, |
322 &report_block, | 320 &report_block, |
323 &rrtr, | 321 &rrtr, |
324 &cast_message, | 322 &cast_message, |
325 &receiver_log); | 323 &event_subscriber); |
326 | 324 |
327 EXPECT_TRUE(receiver_log.empty()); | |
328 EXPECT_EQ(2, test_transport_.packet_count()); | 325 EXPECT_EQ(2, test_transport_.packet_count()); |
329 } | 326 } |
330 | 327 |
331 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { | 328 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { |
332 static const uint32 kTimeBaseMs = 12345678; | 329 static const uint32 kTimeBaseMs = 12345678; |
333 static const uint32 kTimeDelayMs = 10; | 330 static const uint32 kTimeDelayMs = 10; |
334 static const uint32 kDelayDeltaMs = 123; | |
335 | 331 |
336 TestRtcpPacketBuilder p; | 332 TestRtcpPacketBuilder p; |
337 p.AddRr(kSendingSsrc, 1); | 333 p.AddRr(kSendingSsrc, 1); |
338 p.AddRb(kMediaSsrc); | 334 p.AddRb(kMediaSsrc); |
339 p.AddSdesCname(kSendingSsrc, kCName); | 335 p.AddSdesCname(kSendingSsrc, kCName); |
340 | 336 |
341 transport::RtcpReportBlock report_block; | 337 transport::RtcpReportBlock report_block; |
342 // Initialize remote_ssrc to a "clearly illegal" value. | 338 // Initialize remote_ssrc to a "clearly illegal" value. |
343 report_block.remote_ssrc = 0xDEAD; | 339 report_block.remote_ssrc = 0xDEAD; |
344 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. | 340 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
345 report_block.fraction_lost = kLoss >> 24; | 341 report_block.fraction_lost = kLoss >> 24; |
346 report_block.cumulative_lost = kLoss; // 24 bits valid. | 342 report_block.cumulative_lost = kLoss; // 24 bits valid. |
347 report_block.extended_high_sequence_number = kExtendedMax; | 343 report_block.extended_high_sequence_number = kExtendedMax; |
348 report_block.jitter = kTestJitter; | 344 report_block.jitter = kTestJitter; |
349 report_block.last_sr = kLastSr; | 345 report_block.last_sr = kLastSr; |
350 report_block.delay_since_last_sr = kDelayLastSr; | 346 report_block.delay_since_last_sr = kDelayLastSr; |
351 | 347 |
352 base::SimpleTestTickClock testing_clock; | 348 base::SimpleTestTickClock testing_clock; |
353 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 349 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
354 | 350 |
355 p.AddReceiverLog(kSendingSsrc); | 351 p.AddReceiverLog(kSendingSsrc); |
356 | 352 |
357 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs); | 353 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs); |
358 p.AddReceiverEventLog(kDelayDeltaMs, 5, 0); | 354 p.AddReceiverEventLog(0, 5, 0); |
359 p.AddReceiverFrameLog( | 355 p.AddReceiverFrameLog( |
360 kRtpTimestamp + 2345, kRtcpMaxReceiverLogMessages, kTimeBaseMs); | 356 kRtpTimestamp + 2345, kRtcpMaxReceiverLogMessages, kTimeBaseMs); |
361 | 357 |
362 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { | 358 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { |
363 p.AddReceiverEventLog( | 359 p.AddReceiverEventLog( |
364 kLostPacketId1, 8, static_cast<uint16>(kTimeDelayMs * i)); | 360 kLostPacketId1, 8, static_cast<uint16>(kTimeDelayMs * i)); |
365 } | 361 } |
366 | 362 |
367 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | 363 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); |
368 | 364 |
369 RtcpReceiverFrameLogMessage frame_1_log(kRtpTimestamp); | 365 ReceiverRtcpEventSubscriber event_subscriber( |
370 RtcpReceiverEventLogMessage event_log; | 366 500, ReceiverRtcpEventSubscriber::kVideoEventSubscriber); |
| 367 FrameEvent frame_event; |
| 368 frame_event.rtp_timestamp = kRtpTimestamp; |
| 369 frame_event.type = media::cast::kVideoAckSent; |
| 370 frame_event.timestamp = testing_clock.NowTicks(); |
| 371 event_subscriber.OnReceiveFrameEvent(frame_event); |
371 | 372 |
372 event_log.type = kVideoAckSent; | 373 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { |
373 event_log.event_timestamp = testing_clock.NowTicks(); | 374 PacketEvent packet_event; |
374 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); | 375 packet_event.rtp_timestamp = kRtpTimestamp + 2345; |
375 frame_1_log.event_log_messages_.push_back(event_log); | 376 packet_event.type = kVideoPacketReceived; |
376 | 377 packet_event.timestamp = testing_clock.NowTicks(); |
377 RtcpReceiverLogMessage receiver_log; | 378 packet_event.packet_id = kLostPacketId1; |
378 receiver_log.push_back(frame_1_log); | 379 event_subscriber.OnReceivePacketEvent(packet_event); |
379 | |
380 RtcpReceiverFrameLogMessage frame_2_log(kRtpTimestamp + 2345); | |
381 | |
382 for (int j = 0; j < 300; ++j) { | |
383 event_log.type = kVideoPacketReceived; | |
384 event_log.event_timestamp = testing_clock.NowTicks(); | |
385 event_log.packet_id = kLostPacketId1; | |
386 frame_2_log.event_log_messages_.push_back(event_log); | |
387 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 380 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
388 } | 381 } |
389 receiver_log.push_back(frame_2_log); | |
390 | 382 |
391 rtcp_sender_->SendRtcpFromRtpReceiver( | 383 rtcp_sender_->SendRtcpFromRtpReceiver( |
392 RtcpSender::kRtcpRr | RtcpSender::kRtcpReceiverLog, | 384 RtcpSender::kRtcpRr | RtcpSender::kRtcpReceiverLog, |
393 &report_block, | 385 &report_block, |
394 NULL, | 386 NULL, |
395 NULL, | 387 NULL, |
396 &receiver_log); | 388 &event_subscriber); |
397 | 389 |
398 EXPECT_EQ(1, test_transport_.packet_count()); | 390 EXPECT_EQ(1, test_transport_.packet_count()); |
399 EXPECT_EQ(1u, receiver_log.size()); | |
400 EXPECT_EQ(300u - kRtcpMaxReceiverLogMessages, | |
401 receiver_log.front().event_log_messages_.size()); | |
402 } | 391 } |
403 | 392 |
404 TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { | 393 TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { |
405 static const uint32 kTimeBaseMs = 12345678; | 394 static const uint32 kTimeBaseMs = 12345678; |
406 static const uint32 kTimeDelayMs = 10; | 395 static const uint32 kTimeDelayMs = 10; |
407 static const uint32 kDelayDeltaMs = 123; | |
408 | 396 |
409 TestRtcpPacketBuilder p; | 397 TestRtcpPacketBuilder p; |
410 p.AddRr(kSendingSsrc, 1); | 398 p.AddRr(kSendingSsrc, 1); |
411 p.AddRb(kMediaSsrc); | 399 p.AddRb(kMediaSsrc); |
412 p.AddSdesCname(kSendingSsrc, kCName); | 400 p.AddSdesCname(kSendingSsrc, kCName); |
413 | 401 |
414 transport::RtcpReportBlock report_block; | 402 transport::RtcpReportBlock report_block; |
415 // Initialize remote_ssrc to a "clearly illegal" value. | 403 // Initialize remote_ssrc to a "clearly illegal" value. |
416 report_block.remote_ssrc = 0xDEAD; | 404 report_block.remote_ssrc = 0xDEAD; |
417 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. | 405 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
418 report_block.fraction_lost = kLoss >> 24; | 406 report_block.fraction_lost = kLoss >> 24; |
419 report_block.cumulative_lost = kLoss; // 24 bits valid. | 407 report_block.cumulative_lost = kLoss; // 24 bits valid. |
420 report_block.extended_high_sequence_number = kExtendedMax; | 408 report_block.extended_high_sequence_number = kExtendedMax; |
421 report_block.jitter = kTestJitter; | 409 report_block.jitter = kTestJitter; |
422 report_block.last_sr = kLastSr; | 410 report_block.last_sr = kLastSr; |
423 report_block.delay_since_last_sr = kDelayLastSr; | 411 report_block.delay_since_last_sr = kDelayLastSr; |
424 | 412 |
425 base::SimpleTestTickClock testing_clock; | 413 base::SimpleTestTickClock testing_clock; |
426 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 414 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
427 | 415 |
428 p.AddReceiverLog(kSendingSsrc); | 416 p.AddReceiverLog(kSendingSsrc); |
429 | 417 |
430 for (int i = 0; i < 119; ++i) { | 418 for (int i = 0; i < 119; ++i) { |
431 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); | 419 p.AddReceiverFrameLog(kRtpTimestamp + i, 1, kTimeBaseMs + i * kTimeDelayMs); |
432 p.AddReceiverEventLog(kDelayDeltaMs, 5, 0); | 420 p.AddReceiverEventLog(0, 5, 0); |
433 } | 421 } |
434 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | 422 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); |
435 | 423 |
436 RtcpReceiverLogMessage receiver_log; | 424 ReceiverRtcpEventSubscriber event_subscriber( |
437 | 425 500, ReceiverRtcpEventSubscriber::kVideoEventSubscriber); |
438 for (int j = 0; j < 200; ++j) { | 426 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { |
439 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); | 427 FrameEvent frame_event; |
440 RtcpReceiverEventLogMessage event_log; | 428 frame_event.rtp_timestamp = kRtpTimestamp + static_cast<int>(i); |
441 | 429 frame_event.type = media::cast::kVideoAckSent; |
442 event_log.type = kVideoAckSent; | 430 frame_event.timestamp = testing_clock.NowTicks(); |
443 event_log.event_timestamp = testing_clock.NowTicks(); | 431 event_subscriber.OnReceiveFrameEvent(frame_event); |
444 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); | |
445 frame_log.event_log_messages_.push_back(event_log); | |
446 receiver_log.push_back(frame_log); | |
447 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 432 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
448 } | 433 } |
| 434 |
449 rtcp_sender_->SendRtcpFromRtpReceiver( | 435 rtcp_sender_->SendRtcpFromRtpReceiver( |
450 RtcpSender::kRtcpRr | RtcpSender::kRtcpReceiverLog, | 436 RtcpSender::kRtcpRr | RtcpSender::kRtcpReceiverLog, |
451 &report_block, | 437 &report_block, |
452 NULL, | 438 NULL, |
453 NULL, | 439 NULL, |
454 &receiver_log); | 440 &event_subscriber); |
455 | 441 |
456 EXPECT_EQ(1, test_transport_.packet_count()); | 442 EXPECT_EQ(1, test_transport_.packet_count()); |
457 EXPECT_EQ(81u, receiver_log.size()); | |
458 } | 443 } |
459 | 444 |
460 } // namespace cast | 445 } // namespace cast |
461 } // namespace media | 446 } // namespace media |
OLD | NEW |