| 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 <gtest/gtest.h> | 5 #include <gtest/gtest.h> |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| 11 #include "media/cast/rtp_receiver/receiver_stats.h" | 11 #include "media/cast/rtp_receiver/receiver_stats.h" |
| 12 #include "media/cast/rtp_receiver/rtp_receiver_defines.h" | 12 #include "media/cast/rtp_receiver/rtp_receiver_defines.h" |
| 13 | 13 |
| 14 namespace media { | 14 namespace media { |
| 15 namespace cast { | 15 namespace cast { |
| 16 | 16 |
| 17 static const int64 kStartMillisecond = INT64_C(12345678900000); | 17 static const int64 kStartMillisecond = INT64_C(12345678900000); |
| 18 static const uint32 kStdTimeIncrementMs = 33; | 18 static const uint32 kStdTimeIncrementMs = 33; |
| 19 | 19 |
| 20 class ReceiverStatsTest : public ::testing::Test { | 20 class ReceiverStatsTest : public ::testing::Test { |
| 21 protected: | 21 protected: |
| 22 ReceiverStatsTest() | 22 ReceiverStatsTest() |
| 23 : stats_(&testing_clock_), | 23 : stats_(&testing_clock_), |
| 24 rtp_header_(), | |
| 25 fraction_lost_(0), | 24 fraction_lost_(0), |
| 26 cumulative_lost_(0), | 25 cumulative_lost_(0), |
| 27 extended_high_sequence_number_(0), | 26 extended_high_sequence_number_(0), |
| 28 jitter_(0) { | 27 jitter_(0) { |
| 29 testing_clock_.Advance( | 28 testing_clock_.Advance( |
| 30 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 29 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
| 31 start_time_ = testing_clock_.NowTicks(); | 30 start_time_ = testing_clock_.NowTicks(); |
| 32 delta_increments_ = base::TimeDelta::FromMilliseconds(kStdTimeIncrementMs); | 31 delta_increments_ = base::TimeDelta::FromMilliseconds(kStdTimeIncrementMs); |
| 33 rtp_header_.webrtc.header.sequenceNumber = 0; | |
| 34 rtp_header_.webrtc.header.timestamp = 0; | |
| 35 } | 32 } |
| 36 virtual ~ReceiverStatsTest() {} | 33 virtual ~ReceiverStatsTest() {} |
| 37 | 34 |
| 38 uint32 ExpectedJitter(uint32 const_interval, int num_packets) { | 35 uint32 ExpectedJitter(uint32 const_interval, int num_packets) { |
| 39 float jitter = 0; | 36 float jitter = 0; |
| 40 // Assume timestamps have a constant kStdTimeIncrementMs interval. | 37 // Assume timestamps have a constant kStdTimeIncrementMs interval. |
| 41 float float_interval = | 38 float float_interval = |
| 42 static_cast<float>(const_interval - kStdTimeIncrementMs); | 39 static_cast<float>(const_interval - kStdTimeIncrementMs); |
| 43 for (int i = 0; i < num_packets; ++i) { | 40 for (int i = 0; i < num_packets; ++i) { |
| 44 jitter += (float_interval - jitter) / 16; | 41 jitter += (float_interval - jitter) / 16; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 68 EXPECT_EQ(0u, cumulative_lost_); | 65 EXPECT_EQ(0u, cumulative_lost_); |
| 69 EXPECT_EQ(0u, extended_high_sequence_number_); | 66 EXPECT_EQ(0u, extended_high_sequence_number_); |
| 70 EXPECT_EQ(0u, jitter_); | 67 EXPECT_EQ(0u, jitter_); |
| 71 } | 68 } |
| 72 | 69 |
| 73 TEST_F(ReceiverStatsTest, LossCount) { | 70 TEST_F(ReceiverStatsTest, LossCount) { |
| 74 for (int i = 0; i < 300; ++i) { | 71 for (int i = 0; i < 300; ++i) { |
| 75 if (i % 4) | 72 if (i % 4) |
| 76 stats_.UpdateStatistics(rtp_header_); | 73 stats_.UpdateStatistics(rtp_header_); |
| 77 if (i % 3) { | 74 if (i % 3) { |
| 78 rtp_header_.webrtc.header.timestamp += 33 * 90; | 75 rtp_header_.rtp_timestamp += 33 * 90; |
| 79 } | 76 } |
| 80 ++rtp_header_.webrtc.header.sequenceNumber; | 77 ++rtp_header_.sequence_number; |
| 81 testing_clock_.Advance(delta_increments_); | 78 testing_clock_.Advance(delta_increments_); |
| 82 } | 79 } |
| 83 stats_.GetStatistics(&fraction_lost_, | 80 stats_.GetStatistics(&fraction_lost_, |
| 84 &cumulative_lost_, | 81 &cumulative_lost_, |
| 85 &extended_high_sequence_number_, | 82 &extended_high_sequence_number_, |
| 86 &jitter_); | 83 &jitter_); |
| 87 EXPECT_EQ(63u, fraction_lost_); | 84 EXPECT_EQ(63u, fraction_lost_); |
| 88 EXPECT_EQ(74u, cumulative_lost_); | 85 EXPECT_EQ(74u, cumulative_lost_); |
| 89 // Build extended sequence number. | 86 // Build extended sequence number. |
| 90 uint32 extended_seq_num = rtp_header_.webrtc.header.sequenceNumber - 1; | 87 const uint32 extended_seq_num = rtp_header_.sequence_number - 1; |
| 91 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); | 88 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); |
| 92 } | 89 } |
| 93 | 90 |
| 94 TEST_F(ReceiverStatsTest, NoLossWrap) { | 91 TEST_F(ReceiverStatsTest, NoLossWrap) { |
| 95 rtp_header_.webrtc.header.sequenceNumber = 65500; | 92 rtp_header_.sequence_number = 65500; |
| 96 for (int i = 0; i < 300; ++i) { | 93 for (int i = 0; i < 300; ++i) { |
| 97 stats_.UpdateStatistics(rtp_header_); | 94 stats_.UpdateStatistics(rtp_header_); |
| 98 if (i % 3) { | 95 if (i % 3) { |
| 99 rtp_header_.webrtc.header.timestamp += 33 * 90; | 96 rtp_header_.rtp_timestamp += 33 * 90; |
| 100 } | 97 } |
| 101 ++rtp_header_.webrtc.header.sequenceNumber; | 98 ++rtp_header_.sequence_number; |
| 102 testing_clock_.Advance(delta_increments_); | 99 testing_clock_.Advance(delta_increments_); |
| 103 } | 100 } |
| 104 stats_.GetStatistics(&fraction_lost_, | 101 stats_.GetStatistics(&fraction_lost_, |
| 105 &cumulative_lost_, | 102 &cumulative_lost_, |
| 106 &extended_high_sequence_number_, | 103 &extended_high_sequence_number_, |
| 107 &jitter_); | 104 &jitter_); |
| 108 EXPECT_EQ(0u, fraction_lost_); | 105 EXPECT_EQ(0u, fraction_lost_); |
| 109 EXPECT_EQ(0u, cumulative_lost_); | 106 EXPECT_EQ(0u, cumulative_lost_); |
| 110 // Build extended sequence number (one wrap cycle). | 107 // Build extended sequence number (one wrap cycle). |
| 111 uint32 extended_seq_num = | 108 const uint32 extended_seq_num = (1 << 16) + rtp_header_.sequence_number - 1; |
| 112 (1 << 16) + rtp_header_.webrtc.header.sequenceNumber - 1; | |
| 113 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); | 109 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); |
| 114 } | 110 } |
| 115 | 111 |
| 116 TEST_F(ReceiverStatsTest, LossCountWrap) { | 112 TEST_F(ReceiverStatsTest, LossCountWrap) { |
| 117 const uint32 start_sequence_number = 65500; | 113 const uint32 kStartSequenceNumber = 65500; |
| 118 rtp_header_.webrtc.header.sequenceNumber = start_sequence_number; | 114 rtp_header_.sequence_number = kStartSequenceNumber; |
| 119 for (int i = 0; i < 300; ++i) { | 115 for (int i = 0; i < 300; ++i) { |
| 120 if (i % 4) | 116 if (i % 4) |
| 121 stats_.UpdateStatistics(rtp_header_); | 117 stats_.UpdateStatistics(rtp_header_); |
| 122 if (i % 3) | 118 if (i % 3) |
| 123 // Update timestamp. | 119 // Update timestamp. |
| 124 ++rtp_header_.webrtc.header.timestamp; | 120 ++rtp_header_.rtp_timestamp; |
| 125 ++rtp_header_.webrtc.header.sequenceNumber; | 121 ++rtp_header_.sequence_number; |
| 126 testing_clock_.Advance(delta_increments_); | 122 testing_clock_.Advance(delta_increments_); |
| 127 } | 123 } |
| 128 stats_.GetStatistics(&fraction_lost_, | 124 stats_.GetStatistics(&fraction_lost_, |
| 129 &cumulative_lost_, | 125 &cumulative_lost_, |
| 130 &extended_high_sequence_number_, | 126 &extended_high_sequence_number_, |
| 131 &jitter_); | 127 &jitter_); |
| 132 EXPECT_EQ(63u, fraction_lost_); | 128 EXPECT_EQ(63u, fraction_lost_); |
| 133 EXPECT_EQ(74u, cumulative_lost_); | 129 EXPECT_EQ(74u, cumulative_lost_); |
| 134 // Build extended sequence number (one wrap cycle). | 130 // Build extended sequence number (one wrap cycle). |
| 135 uint32 extended_seq_num = | 131 const uint32 extended_seq_num = (1 << 16) + rtp_header_.sequence_number - 1; |
| 136 (1 << 16) + rtp_header_.webrtc.header.sequenceNumber - 1; | |
| 137 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); | 132 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); |
| 138 } | 133 } |
| 139 | 134 |
| 140 TEST_F(ReceiverStatsTest, BasicJitter) { | 135 TEST_F(ReceiverStatsTest, BasicJitter) { |
| 141 for (int i = 0; i < 300; ++i) { | 136 for (int i = 0; i < 300; ++i) { |
| 142 stats_.UpdateStatistics(rtp_header_); | 137 stats_.UpdateStatistics(rtp_header_); |
| 143 ++rtp_header_.webrtc.header.sequenceNumber; | 138 ++rtp_header_.sequence_number; |
| 144 rtp_header_.webrtc.header.timestamp += 33 * 90; | 139 rtp_header_.rtp_timestamp += 33 * 90; |
| 145 testing_clock_.Advance(delta_increments_); | 140 testing_clock_.Advance(delta_increments_); |
| 146 } | 141 } |
| 147 stats_.GetStatistics(&fraction_lost_, | 142 stats_.GetStatistics(&fraction_lost_, |
| 148 &cumulative_lost_, | 143 &cumulative_lost_, |
| 149 &extended_high_sequence_number_, | 144 &extended_high_sequence_number_, |
| 150 &jitter_); | 145 &jitter_); |
| 151 EXPECT_FALSE(fraction_lost_); | 146 EXPECT_FALSE(fraction_lost_); |
| 152 EXPECT_FALSE(cumulative_lost_); | 147 EXPECT_FALSE(cumulative_lost_); |
| 153 // Build extended sequence number (one wrap cycle). | 148 // Build extended sequence number (one wrap cycle). |
| 154 uint32 extended_seq_num = rtp_header_.webrtc.header.sequenceNumber - 1; | 149 const uint32 extended_seq_num = rtp_header_.sequence_number - 1; |
| 155 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); | 150 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); |
| 156 EXPECT_EQ(ExpectedJitter(kStdTimeIncrementMs, 300), jitter_); | 151 EXPECT_EQ(ExpectedJitter(kStdTimeIncrementMs, 300), jitter_); |
| 157 } | 152 } |
| 158 | 153 |
| 159 TEST_F(ReceiverStatsTest, NonTrivialJitter) { | 154 TEST_F(ReceiverStatsTest, NonTrivialJitter) { |
| 160 const int kAdditionalIncrement = 5; | 155 const int kAdditionalIncrement = 5; |
| 161 for (int i = 0; i < 300; ++i) { | 156 for (int i = 0; i < 300; ++i) { |
| 162 stats_.UpdateStatistics(rtp_header_); | 157 stats_.UpdateStatistics(rtp_header_); |
| 163 ++rtp_header_.webrtc.header.sequenceNumber; | 158 ++rtp_header_.sequence_number; |
| 164 rtp_header_.webrtc.header.timestamp += 33 * 90; | 159 rtp_header_.rtp_timestamp += 33 * 90; |
| 165 base::TimeDelta additional_delta = | 160 base::TimeDelta additional_delta = |
| 166 base::TimeDelta::FromMilliseconds(kAdditionalIncrement); | 161 base::TimeDelta::FromMilliseconds(kAdditionalIncrement); |
| 167 testing_clock_.Advance(delta_increments_ + additional_delta); | 162 testing_clock_.Advance(delta_increments_ + additional_delta); |
| 168 } | 163 } |
| 169 stats_.GetStatistics(&fraction_lost_, | 164 stats_.GetStatistics(&fraction_lost_, |
| 170 &cumulative_lost_, | 165 &cumulative_lost_, |
| 171 &extended_high_sequence_number_, | 166 &extended_high_sequence_number_, |
| 172 &jitter_); | 167 &jitter_); |
| 173 EXPECT_FALSE(fraction_lost_); | 168 EXPECT_FALSE(fraction_lost_); |
| 174 EXPECT_FALSE(cumulative_lost_); | 169 EXPECT_FALSE(cumulative_lost_); |
| 175 // Build extended sequence number (one wrap cycle). | 170 // Build extended sequence number (one wrap cycle). |
| 176 uint32 extended_seq_num = rtp_header_.webrtc.header.sequenceNumber - 1; | 171 const uint32 extended_seq_num = rtp_header_.sequence_number - 1; |
| 177 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); | 172 EXPECT_EQ(extended_seq_num, extended_high_sequence_number_); |
| 178 EXPECT_EQ(ExpectedJitter(kStdTimeIncrementMs + kAdditionalIncrement, 300), | 173 EXPECT_EQ(ExpectedJitter(kStdTimeIncrementMs + kAdditionalIncrement, 300), |
| 179 jitter_); | 174 jitter_); |
| 180 } | 175 } |
| 181 | 176 |
| 182 } // namespace cast | 177 } // namespace cast |
| 183 } // namespace media | 178 } // namespace media |
| OLD | NEW |