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 |