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 <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include "base/test/simple_test_tick_clock.h" | 7 #include "base/test/simple_test_tick_clock.h" |
8 #include "media/cast/cast_defines.h" | 8 #include "media/cast/cast_defines.h" |
9 #include "media/cast/cast_environment.h" | 9 #include "media/cast/cast_environment.h" |
10 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" | 10 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 transport_sender, | 135 transport_sender, |
136 paced_packet_sender, | 136 paced_packet_sender, |
137 rtp_receiver_statistics, | 137 rtp_receiver_statistics, |
138 rtcp_mode, | 138 rtcp_mode, |
139 rtcp_interval, | 139 rtcp_interval, |
140 local_ssrc, | 140 local_ssrc, |
141 remote_ssrc, | 141 remote_ssrc, |
142 c_name, | 142 c_name, |
143 true) {} | 143 true) {} |
144 | 144 |
145 using Rtcp::CheckForWrapAround; | 145 using Rtcp::OnReceivedNtp; |
146 using Rtcp::OnReceivedLipSyncInfo; | 146 using Rtcp::OnReceivedLipSyncInfo; |
147 }; | 147 }; |
148 | 148 |
149 class RtcpTest : public ::testing::Test { | 149 class RtcpTest : public ::testing::Test { |
150 protected: | 150 protected: |
151 RtcpTest() | 151 RtcpTest() |
152 : testing_clock_(new base::SimpleTestTickClock()), | 152 : testing_clock_(new base::SimpleTestTickClock()), |
153 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | 153 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
154 cast_environment_(new CastEnvironment( | 154 cast_environment_(new CastEnvironment( |
155 scoped_ptr<base::TickClock>(testing_clock_).Pass(), | 155 scoped_ptr<base::TickClock>(testing_clock_).Pass(), |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 scoped_refptr<CastEnvironment> cast_environment_; | 197 scoped_refptr<CastEnvironment> cast_environment_; |
198 RtcpTestPacketSender sender_to_receiver_; | 198 RtcpTestPacketSender sender_to_receiver_; |
199 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | 199 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; |
200 LocalRtcpTransport receiver_to_sender_; | 200 LocalRtcpTransport receiver_to_sender_; |
201 MockRtcpSenderFeedback mock_sender_feedback_; | 201 MockRtcpSenderFeedback mock_sender_feedback_; |
202 | 202 |
203 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 203 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
204 }; | 204 }; |
205 | 205 |
206 TEST_F(RtcpTest, TimeToSend) { | 206 TEST_F(RtcpTest, TimeToSend) { |
207 base::TimeTicks start_time = testing_clock_->NowTicks(); | 207 const base::TimeTicks start_time = testing_clock_->NowTicks(); |
208 Rtcp rtcp(cast_environment_, | 208 Rtcp rtcp(cast_environment_, |
209 &mock_sender_feedback_, | 209 &mock_sender_feedback_, |
210 transport_sender_.get(), | 210 transport_sender_.get(), |
211 &receiver_to_sender_, | 211 &receiver_to_sender_, |
212 NULL, | 212 NULL, |
213 kRtcpCompound, | 213 kRtcpCompound, |
214 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | 214 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), |
215 kSenderSsrc, | 215 kSenderSsrc, |
216 kReceiverSsrc, | 216 kReceiverSsrc, |
217 kCName, | 217 kCName, |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 | 491 |
492 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | 492 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); |
493 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2); | 493 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2); |
494 } | 494 } |
495 | 495 |
496 TEST_F(RtcpTest, NtpAndTime) { | 496 TEST_F(RtcpTest, NtpAndTime) { |
497 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); | 497 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); |
498 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); | 498 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); |
499 | 499 |
500 uint32 ntp_seconds_1 = 0; | 500 uint32 ntp_seconds_1 = 0; |
501 uint32 ntp_fractions_1 = 0; | 501 uint32 ntp_fraction_1 = 0; |
502 base::TimeTicks input_time = base::TimeTicks::Now(); | 502 base::TimeTicks input_time = base::TimeTicks::Now(); |
503 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fractions_1); | 503 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fraction_1); |
504 | 504 |
505 // Verify absolute value. | 505 // Verify absolute value. |
506 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010); | 506 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010); |
507 EXPECT_LT(ntp_seconds_1, kSecondsbetweenYear1900and2030); | 507 EXPECT_LT(ntp_seconds_1, kSecondsbetweenYear1900and2030); |
508 | 508 |
509 base::TimeTicks out_1 = ConvertNtpToTimeTicks(ntp_seconds_1, ntp_fractions_1); | 509 base::TimeTicks out_1 = ConvertNtpToTimeTicks(ntp_seconds_1, ntp_fraction_1); |
510 EXPECT_EQ(input_time, out_1); // Verify inverse. | 510 EXPECT_EQ(input_time, out_1); // Verify inverse. |
511 | 511 |
512 base::TimeDelta time_delta = base::TimeDelta::FromMilliseconds(1000); | 512 base::TimeDelta time_delta = base::TimeDelta::FromMilliseconds(1000); |
513 input_time += time_delta; | 513 input_time += time_delta; |
514 | 514 |
515 uint32 ntp_seconds_2 = 0; | 515 uint32 ntp_seconds_2 = 0; |
516 uint32 ntp_fractions_2 = 0; | 516 uint32 ntp_fraction_2 = 0; |
517 | 517 |
518 ConvertTimeTicksToNtp(input_time, &ntp_seconds_2, &ntp_fractions_2); | 518 ConvertTimeTicksToNtp(input_time, &ntp_seconds_2, &ntp_fraction_2); |
519 base::TimeTicks out_2 = ConvertNtpToTimeTicks(ntp_seconds_2, ntp_fractions_2); | 519 base::TimeTicks out_2 = ConvertNtpToTimeTicks(ntp_seconds_2, ntp_fraction_2); |
520 EXPECT_EQ(input_time, out_2); // Verify inverse. | 520 EXPECT_EQ(input_time, out_2); // Verify inverse. |
521 | 521 |
522 // Verify delta. | 522 // Verify delta. |
523 EXPECT_EQ((out_2 - out_1), time_delta); | 523 EXPECT_EQ((out_2 - out_1), time_delta); |
524 EXPECT_EQ((ntp_seconds_2 - ntp_seconds_1), UINT32_C(1)); | 524 EXPECT_EQ((ntp_seconds_2 - ntp_seconds_1), UINT32_C(1)); |
525 EXPECT_NEAR(ntp_fractions_2, ntp_fractions_1, 1); | 525 EXPECT_NEAR(ntp_fraction_2, ntp_fraction_1, 1); |
526 | 526 |
527 time_delta = base::TimeDelta::FromMilliseconds(500); | 527 time_delta = base::TimeDelta::FromMilliseconds(500); |
528 input_time += time_delta; | 528 input_time += time_delta; |
529 | 529 |
530 uint32 ntp_seconds_3 = 0; | 530 uint32 ntp_seconds_3 = 0; |
531 uint32 ntp_fractions_3 = 0; | 531 uint32 ntp_fraction_3 = 0; |
532 | 532 |
533 ConvertTimeTicksToNtp(input_time, &ntp_seconds_3, &ntp_fractions_3); | 533 ConvertTimeTicksToNtp(input_time, &ntp_seconds_3, &ntp_fraction_3); |
534 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fractions_3); | 534 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
535 EXPECT_EQ(input_time, out_3); // Verify inverse. | 535 EXPECT_EQ(input_time, out_3); // Verify inverse. |
536 | 536 |
537 // Verify delta. | 537 // Verify delta. |
538 EXPECT_EQ((out_3 - out_2), time_delta); | 538 EXPECT_EQ((out_3 - out_2), time_delta); |
539 EXPECT_NEAR((ntp_fractions_3 - ntp_fractions_2), 0xffffffff / 2, 1); | 539 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
540 } | |
541 | |
542 TEST_F(RtcpTest, WrapAround) { | |
543 RtcpPeer rtcp_peer(cast_environment_, | |
544 &mock_sender_feedback_, | |
545 transport_sender_.get(), | |
546 NULL, | |
547 NULL, | |
548 kRtcpReducedSize, | |
549 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
550 kReceiverSsrc, | |
551 kSenderSsrc, | |
552 kCName); | |
553 uint32 new_timestamp = 0; | |
554 uint32 old_timestamp = 0; | |
555 EXPECT_EQ(0, rtcp_peer.CheckForWrapAround(new_timestamp, old_timestamp)); | |
556 new_timestamp = 1234567890; | |
557 old_timestamp = 1234567000; | |
558 EXPECT_EQ(0, rtcp_peer.CheckForWrapAround(new_timestamp, old_timestamp)); | |
559 new_timestamp = 1234567000; | |
560 old_timestamp = 1234567890; | |
561 EXPECT_EQ(0, rtcp_peer.CheckForWrapAround(new_timestamp, old_timestamp)); | |
562 new_timestamp = 123; | |
563 old_timestamp = 4234567890u; | |
564 EXPECT_EQ(1, rtcp_peer.CheckForWrapAround(new_timestamp, old_timestamp)); | |
565 new_timestamp = 4234567890u; | |
566 old_timestamp = 123; | |
567 EXPECT_EQ(-1, rtcp_peer.CheckForWrapAround(new_timestamp, old_timestamp)); | |
568 } | |
569 | |
570 TEST_F(RtcpTest, RtpTimestampInSenderTime) { | |
571 RtcpPeer rtcp_peer(cast_environment_, | |
572 &mock_sender_feedback_, | |
573 transport_sender_.get(), | |
574 &receiver_to_sender_, | |
575 NULL, | |
576 kRtcpReducedSize, | |
577 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
578 kReceiverSsrc, | |
579 kSenderSsrc, | |
580 kCName); | |
581 int frequency = 32000; | |
582 uint32 rtp_timestamp = 64000; | |
583 base::TimeTicks rtp_timestamp_in_ticks; | |
584 | |
585 // Test fail before we get a OnReceivedLipSyncInfo. | |
586 EXPECT_FALSE(rtcp_peer.RtpTimestampInSenderTime( | |
587 frequency, rtp_timestamp, &rtp_timestamp_in_ticks)); | |
588 | |
589 uint32 ntp_seconds = 0; | |
590 uint32 ntp_fractions = 0; | |
591 uint64 input_time_us = 12345678901000LL; | |
592 base::TimeTicks input_time; | |
593 input_time += base::TimeDelta::FromMicroseconds(input_time_us); | |
594 | |
595 // Test exact match. | |
596 ConvertTimeTicksToNtp(input_time, &ntp_seconds, &ntp_fractions); | |
597 rtcp_peer.OnReceivedLipSyncInfo(rtp_timestamp, ntp_seconds, ntp_fractions); | |
598 EXPECT_TRUE(rtcp_peer.RtpTimestampInSenderTime( | |
599 frequency, rtp_timestamp, &rtp_timestamp_in_ticks)); | |
600 EXPECT_EQ(input_time, rtp_timestamp_in_ticks); | |
601 | |
602 // Test older rtp_timestamp. | |
603 rtp_timestamp = 32000; | |
604 EXPECT_TRUE(rtcp_peer.RtpTimestampInSenderTime( | |
605 frequency, rtp_timestamp, &rtp_timestamp_in_ticks)); | |
606 EXPECT_EQ(input_time - base::TimeDelta::FromMilliseconds(1000), | |
607 rtp_timestamp_in_ticks); | |
608 | |
609 // Test older rtp_timestamp with wrap. | |
610 rtp_timestamp = 4294903296u; | |
611 EXPECT_TRUE(rtcp_peer.RtpTimestampInSenderTime( | |
612 frequency, rtp_timestamp, &rtp_timestamp_in_ticks)); | |
613 EXPECT_EQ(input_time - base::TimeDelta::FromMilliseconds(4000), | |
614 rtp_timestamp_in_ticks); | |
615 | |
616 // Test newer rtp_timestamp. | |
617 rtp_timestamp = 128000; | |
618 EXPECT_TRUE(rtcp_peer.RtpTimestampInSenderTime( | |
619 frequency, rtp_timestamp, &rtp_timestamp_in_ticks)); | |
620 EXPECT_EQ(input_time + base::TimeDelta::FromMilliseconds(2000), | |
621 rtp_timestamp_in_ticks); | |
622 | |
623 // Test newer rtp_timestamp with wrap. | |
624 rtp_timestamp = 4294903296u; | |
625 rtcp_peer.OnReceivedLipSyncInfo(rtp_timestamp, ntp_seconds, ntp_fractions); | |
626 rtp_timestamp = 64000; | |
627 EXPECT_TRUE(rtcp_peer.RtpTimestampInSenderTime( | |
628 frequency, rtp_timestamp, &rtp_timestamp_in_ticks)); | |
629 EXPECT_EQ(input_time + base::TimeDelta::FromMilliseconds(4000), | |
630 rtp_timestamp_in_ticks); | |
631 } | 540 } |
632 | 541 |
633 } // namespace cast | 542 } // namespace cast |
634 } // namespace media | 543 } // namespace media |
OLD | NEW |