OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unitt est_helper.h" | 10 #include "webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.h " |
11 | 11 |
12 #include <algorithm> | 12 #include <algorithm> |
13 #include <limits> | 13 #include <limits> |
14 #include <utility> | 14 #include <utility> |
15 | 15 |
16 #include "webrtc/modules/congestion_controller/delay_based_bwe.h" | |
philipel
2016/07/06 13:36:36
Maybe move before system includes? Not sure...
stefan-webrtc
2016/07/06 14:53:24
No, should be after according to style guides.
philipel
2016/07/07 08:11:38
Acknowledged.
| |
17 | |
16 namespace webrtc { | 18 namespace webrtc { |
17 | 19 |
18 const size_t kMtu = 1200; | 20 const size_t kMtu = 1200; |
19 const uint32_t kAcceptedBitrateErrorBps = 50000; | 21 const uint32_t kAcceptedBitrateErrorBps = 50000; |
20 | 22 |
21 // Number of packets needed before we have a valid estimate. | 23 // Number of packets needed before we have a valid estimate. |
22 const int kNumInitialPackets = 2; | 24 const int kNumInitialPackets = 2; |
23 | 25 |
24 namespace testing { | 26 namespace test { |
25 | 27 |
26 void TestBitrateObserver::OnReceiveBitrateChanged( | 28 void TestBitrateObserver::OnReceiveBitrateChanged( |
27 const std::vector<uint32_t>& ssrcs, | 29 const std::vector<uint32_t>& ssrcs, |
28 uint32_t bitrate) { | 30 uint32_t bitrate) { |
29 latest_bitrate_ = bitrate; | 31 latest_bitrate_ = bitrate; |
30 updated_ = true; | 32 updated_ = true; |
31 } | 33 } |
32 | 34 |
33 RtpStream::RtpStream(int fps, | 35 RtpStream::RtpStream(int fps, int bitrate_bps) |
34 int bitrate_bps, | |
35 uint32_t ssrc, | |
36 uint32_t frequency, | |
37 uint32_t timestamp_offset, | |
38 int64_t rtcp_receive_time) | |
39 : fps_(fps), | 36 : fps_(fps), |
40 bitrate_bps_(bitrate_bps), | 37 bitrate_bps_(bitrate_bps), |
41 ssrc_(ssrc), | |
42 frequency_(frequency), | |
43 next_rtp_time_(0), | 38 next_rtp_time_(0), |
44 next_rtcp_time_(rtcp_receive_time), | 39 sequence_number_(0) { |
45 rtp_timestamp_offset_(timestamp_offset), | |
46 kNtpFracPerMs(4.294967296E6) { | |
47 assert(fps_ > 0); | 40 assert(fps_ > 0); |
philipel
2016/07/06 13:36:36
ASSERT_GT
| |
48 } | 41 } |
49 | 42 |
50 void RtpStream::set_rtp_timestamp_offset(uint32_t offset) { | |
51 rtp_timestamp_offset_ = offset; | |
52 } | |
53 | |
54 // Generates a new frame for this stream. If called too soon after the | 43 // Generates a new frame for this stream. If called too soon after the |
55 // previous frame, no frame will be generated. The frame is split into | 44 // previous frame, no frame will be generated. The frame is split into |
56 // packets. | 45 // packets. |
57 int64_t RtpStream::GenerateFrame(int64_t time_now_us, PacketList* packets) { | 46 int64_t RtpStream::GenerateFrame(int64_t time_now_us, |
47 std::vector<PacketInfo>* packets) { | |
58 if (time_now_us < next_rtp_time_) { | 48 if (time_now_us < next_rtp_time_) { |
59 return next_rtp_time_; | 49 return next_rtp_time_; |
60 } | 50 } |
61 assert(packets != NULL); | 51 assert(packets != NULL); |
philipel
2016/07/06 13:36:36
ASSERT
stefan-webrtc
2016/07/06 14:53:24
Can only be done from functions returning void. I'
| |
62 size_t bits_per_frame = (bitrate_bps_ + fps_ / 2) / fps_; | 52 size_t bits_per_frame = (bitrate_bps_ + fps_ / 2) / fps_; |
63 size_t n_packets = | 53 size_t n_packets = |
64 std::max<size_t>((bits_per_frame + 4 * kMtu) / (8 * kMtu), 1u); | 54 std::max<size_t>((bits_per_frame + 4 * kMtu) / (8 * kMtu), 1u); |
65 size_t packet_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets); | 55 size_t payload_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets); |
66 for (size_t i = 0; i < n_packets; ++i) { | 56 for (size_t i = 0; i < n_packets; ++i) { |
67 RtpPacket* packet = new RtpPacket; | 57 PacketInfo packet(-1, -1); |
68 packet->send_time = time_now_us + kSendSideOffsetUs; | 58 packet.send_time_ms = (time_now_us + kSendSideOffsetUs) / 1000; |
69 packet->size = packet_size; | 59 packet.payload_size = payload_size; |
70 packet->rtp_timestamp = rtp_timestamp_offset_ + static_cast<uint32_t>( | 60 packet.sequence_number = sequence_number_++; |
71 ((frequency_ / 1000) * packet->send_time + 500) / 1000); | 61 packet.probe_cluster_id = PacketInfo::kNotAProbe; |
72 packet->ssrc = ssrc_; | |
73 packets->push_back(packet); | 62 packets->push_back(packet); |
74 } | 63 } |
75 next_rtp_time_ = time_now_us + (1000000 + fps_ / 2) / fps_; | 64 next_rtp_time_ = time_now_us + (1000000 + fps_ / 2) / fps_; |
76 return next_rtp_time_; | 65 return next_rtp_time_; |
77 } | 66 } |
78 | 67 |
79 // The send-side time when the next frame can be generated. | 68 // The send-side time when the next frame can be generated. |
80 double RtpStream::next_rtp_time() const { | 69 double RtpStream::next_rtp_time() const { |
81 return next_rtp_time_; | 70 return next_rtp_time_; |
82 } | 71 } |
83 | 72 |
84 // Generates an RTCP packet. | |
85 RtpStream::RtcpPacket* RtpStream::Rtcp(int64_t time_now_us) { | |
86 if (time_now_us < next_rtcp_time_) { | |
87 return NULL; | |
88 } | |
89 RtcpPacket* rtcp = new RtcpPacket; | |
90 int64_t send_time_us = time_now_us + kSendSideOffsetUs; | |
91 rtcp->timestamp = rtp_timestamp_offset_ + static_cast<uint32_t>( | |
92 ((frequency_ / 1000) * send_time_us + 500) / 1000); | |
93 rtcp->ntp_secs = send_time_us / 1000000; | |
94 rtcp->ntp_frac = static_cast<int64_t>((send_time_us % 1000000) * | |
95 kNtpFracPerMs); | |
96 rtcp->ssrc = ssrc_; | |
97 next_rtcp_time_ = time_now_us + kRtcpIntervalUs; | |
98 return rtcp; | |
99 } | |
100 | |
101 void RtpStream::set_bitrate_bps(int bitrate_bps) { | 73 void RtpStream::set_bitrate_bps(int bitrate_bps) { |
102 ASSERT_GE(bitrate_bps, 0); | 74 ASSERT_GE(bitrate_bps, 0); |
103 bitrate_bps_ = bitrate_bps; | 75 bitrate_bps_ = bitrate_bps; |
104 } | 76 } |
105 | 77 |
106 int RtpStream::bitrate_bps() const { | 78 int RtpStream::bitrate_bps() const { |
107 return bitrate_bps_; | 79 return bitrate_bps_; |
108 } | 80 } |
109 | 81 |
110 uint32_t RtpStream::ssrc() const { | 82 bool RtpStream::Compare(const std::unique_ptr<RtpStream>& lhs, |
111 return ssrc_; | 83 const std::unique_ptr<RtpStream>& rhs) { |
112 } | 84 return lhs->next_rtp_time_ < rhs->next_rtp_time_; |
113 | |
114 bool RtpStream::Compare(const std::pair<uint32_t, RtpStream*>& left, | |
115 const std::pair<uint32_t, RtpStream*>& right) { | |
116 return left.second->next_rtp_time_ < right.second->next_rtp_time_; | |
117 } | 85 } |
118 | 86 |
119 StreamGenerator::StreamGenerator(int capacity, double time_now) | 87 StreamGenerator::StreamGenerator(int capacity, double time_now) |
120 : capacity_(capacity), | 88 : capacity_(capacity), prev_arrival_time_us_(time_now) {} |
121 prev_arrival_time_us_(time_now) {} | |
122 | 89 |
123 StreamGenerator::~StreamGenerator() { | 90 StreamGenerator::~StreamGenerator() {} |
philipel
2016/07/06 13:36:36
Remove empty destructor
stefan-webrtc
2016/07/06 14:53:24
Done.
| |
124 for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); | |
125 ++it) { | |
126 delete it->second; | |
127 } | |
128 streams_.clear(); | |
129 } | |
130 | 91 |
131 // Add a new stream. | 92 // Add a new stream. |
132 void StreamGenerator::AddStream(RtpStream* stream) { | 93 void StreamGenerator::AddStream(RtpStream* stream) { |
133 streams_[stream->ssrc()] = stream; | 94 streams_.push_back(std::unique_ptr<RtpStream>(stream)); |
134 } | 95 } |
135 | 96 |
136 // Set the link capacity. | 97 // Set the link capacity. |
137 void StreamGenerator::set_capacity_bps(int capacity_bps) { | 98 void StreamGenerator::set_capacity_bps(int capacity_bps) { |
138 ASSERT_GT(capacity_bps, 0); | 99 ASSERT_GT(capacity_bps, 0); |
139 capacity_ = capacity_bps; | 100 capacity_ = capacity_bps; |
140 } | 101 } |
141 | 102 |
142 // Divides |bitrate_bps| among all streams. The allocated bitrate per stream | 103 // Divides |bitrate_bps| among all streams. The allocated bitrate per stream |
143 // is decided by the current allocation ratios. | 104 // is decided by the current allocation ratios. |
144 void StreamGenerator::SetBitrateBps(int bitrate_bps) { | 105 void StreamGenerator::SetBitrateBps(int bitrate_bps) { |
145 ASSERT_GE(streams_.size(), 0u); | 106 ASSERT_GE(streams_.size(), 0u); |
146 int total_bitrate_before = 0; | 107 int total_bitrate_before = 0; |
147 for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); ++it) { | 108 for (const auto& stream : streams_) { |
148 total_bitrate_before += it->second->bitrate_bps(); | 109 total_bitrate_before += stream->bitrate_bps(); |
149 } | 110 } |
150 int64_t bitrate_before = 0; | 111 int64_t bitrate_before = 0; |
151 int total_bitrate_after = 0; | 112 int total_bitrate_after = 0; |
152 for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); ++it) { | 113 for (const auto& stream : streams_) { |
153 bitrate_before += it->second->bitrate_bps(); | 114 bitrate_before += stream->bitrate_bps(); |
154 int64_t bitrate_after = (bitrate_before * bitrate_bps + | 115 int64_t bitrate_after = |
155 total_bitrate_before / 2) / total_bitrate_before; | 116 (bitrate_before * bitrate_bps + total_bitrate_before / 2) / |
156 it->second->set_bitrate_bps(bitrate_after - total_bitrate_after); | 117 total_bitrate_before; |
157 total_bitrate_after += it->second->bitrate_bps(); | 118 stream->set_bitrate_bps(bitrate_after - total_bitrate_after); |
119 total_bitrate_after += stream->bitrate_bps(); | |
158 } | 120 } |
159 ASSERT_EQ(bitrate_before, total_bitrate_before); | 121 ASSERT_EQ(bitrate_before, total_bitrate_before); |
160 EXPECT_EQ(total_bitrate_after, bitrate_bps); | 122 EXPECT_EQ(total_bitrate_after, bitrate_bps); |
161 } | 123 } |
162 | 124 |
163 // Set the RTP timestamp offset for the stream identified by |ssrc|. | |
164 void StreamGenerator::set_rtp_timestamp_offset(uint32_t ssrc, uint32_t offset) { | |
165 streams_[ssrc]->set_rtp_timestamp_offset(offset); | |
166 } | |
167 | |
168 // TODO(holmer): Break out the channel simulation part from this class to make | 125 // TODO(holmer): Break out the channel simulation part from this class to make |
169 // it possible to simulate different types of channels. | 126 // it possible to simulate different types of channels. |
170 int64_t StreamGenerator::GenerateFrame(RtpStream::PacketList* packets, | 127 int64_t StreamGenerator::GenerateFrame(std::vector<PacketInfo>* packets, |
171 int64_t time_now_us) { | 128 int64_t time_now_us) { |
172 assert(packets != NULL); | 129 assert(packets != NULL); |
173 assert(packets->empty()); | 130 assert(packets->empty()); |
174 assert(capacity_ > 0); | 131 assert(capacity_ > 0); |
philipel
2016/07/06 13:36:36
ASSERT, ASSERT, ASSERT_GT
stefan-webrtc
2016/07/06 14:53:24
Same here.
| |
175 StreamMap::iterator it = std::min_element(streams_.begin(), streams_.end(), | 132 auto it = |
176 RtpStream::Compare); | 133 std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare); |
177 (*it).second->GenerateFrame(time_now_us, packets); | 134 (*it)->GenerateFrame(time_now_us, packets); |
178 int i = 0; | 135 int i = 0; |
179 for (RtpStream::PacketList::iterator packet_it = packets->begin(); | 136 for (PacketInfo& packet : *packets) { |
180 packet_it != packets->end(); ++packet_it) { | |
181 int capacity_bpus = capacity_ / 1000; | 137 int capacity_bpus = capacity_ / 1000; |
182 int64_t required_network_time_us = | 138 int64_t required_network_time_us = |
183 (8 * 1000 * (*packet_it)->size + capacity_bpus / 2) / capacity_bpus; | 139 (8 * 1000 * packet.payload_size + capacity_bpus / 2) / capacity_bpus; |
184 prev_arrival_time_us_ = std::max(time_now_us + required_network_time_us, | 140 prev_arrival_time_us_ = |
185 prev_arrival_time_us_ + required_network_time_us); | 141 std::max(time_now_us + required_network_time_us, |
186 (*packet_it)->arrival_time = prev_arrival_time_us_; | 142 prev_arrival_time_us_ + required_network_time_us); |
143 packet.arrival_time_ms = prev_arrival_time_us_ / 1000; | |
187 ++i; | 144 ++i; |
188 } | 145 } |
189 it = std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare); | 146 it = std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare); |
190 return (*it).second->next_rtp_time(); | 147 return (*it)->next_rtp_time(); |
191 } | 148 } |
192 } // namespace testing | 149 } // namespace test |
193 | 150 |
194 RemoteBitrateEstimatorTest::RemoteBitrateEstimatorTest() | 151 DelayBasedBweTest::DelayBasedBweTest() |
195 : clock_(0), | 152 : clock_(0), |
196 bitrate_observer_(new testing::TestBitrateObserver), | 153 bitrate_observer_(new test::TestBitrateObserver), |
197 stream_generator_(new testing::StreamGenerator( | 154 bitrate_estimator_(new DelayBasedBwe(bitrate_observer_.get(), &clock_)), |
198 1e6, // Capacity. | 155 stream_generator_( |
199 clock_.TimeInMicroseconds())) {} | 156 new test::StreamGenerator(1e6, // Capacity. |
157 clock_.TimeInMicroseconds())) {} | |
200 | 158 |
201 RemoteBitrateEstimatorTest::~RemoteBitrateEstimatorTest() {} | 159 DelayBasedBweTest::~DelayBasedBweTest() {} |
202 | 160 |
203 void RemoteBitrateEstimatorTest::AddDefaultStream() { | 161 void DelayBasedBweTest::AddDefaultStream() { |
204 stream_generator_->AddStream(new testing::RtpStream( | 162 stream_generator_->AddStream(new test::RtpStream(30, 3e5)); |
205 30, // Frames per second. | |
206 3e5, // Bitrate. | |
207 1, // SSRC. | |
208 90000, // RTP frequency. | |
209 0xFFFFF000, // Timestamp offset. | |
210 0)); // RTCP receive time. | |
211 } | 163 } |
212 | 164 |
213 uint32_t RemoteBitrateEstimatorTest::AbsSendTime(int64_t t, int64_t denom) { | 165 const uint32_t DelayBasedBweTest::kDefaultSsrc = 0; |
214 return (((t << 18) + (denom >> 1)) / denom) & 0x00fffffful; | 166 |
167 void DelayBasedBweTest::IncomingPacket(size_t payload_size, | |
168 int64_t arrival_time_ms, | |
169 int64_t send_time_ms, | |
170 uint16_t sequence_number) { | |
171 IncomingPacket(payload_size, arrival_time_ms, send_time_ms, sequence_number, | |
philipel
2016/07/06 13:36:36
Remove |sequence_number| argument and set to 0.
| |
172 0); | |
215 } | 173 } |
216 | 174 |
217 uint32_t RemoteBitrateEstimatorTest::AddAbsSendTime(uint32_t t1, uint32_t t2) { | 175 void DelayBasedBweTest::IncomingPacket(size_t payload_size, |
218 return (t1 + t2) & 0x00fffffful; | 176 int64_t arrival_time_ms, |
219 } | 177 int64_t send_time_ms, |
220 | 178 uint16_t sequence_number, |
221 const uint32_t RemoteBitrateEstimatorTest::kDefaultSsrc = 1; | 179 int probe_cluster_id) { |
222 | 180 PacketInfo packet(arrival_time_ms + arrival_time_offset_ms_, send_time_ms, |
223 void RemoteBitrateEstimatorTest::IncomingPacket(uint32_t ssrc, | 181 sequence_number, payload_size, probe_cluster_id); |
philipel
2016/07/06 13:36:36
Remove |sequence_number| argument and set to 0.
| |
224 size_t payload_size, | 182 std::vector<PacketInfo> packets; |
225 int64_t arrival_time, | 183 packets.push_back(packet); |
226 uint32_t rtp_timestamp, | 184 bitrate_estimator_->IncomingPacketFeedbackVector(packets); |
227 uint32_t absolute_send_time) { | |
228 RTPHeader header; | |
229 memset(&header, 0, sizeof(header)); | |
230 header.ssrc = ssrc; | |
231 header.timestamp = rtp_timestamp; | |
232 header.extension.hasAbsoluteSendTime = true; | |
233 header.extension.absoluteSendTime = absolute_send_time; | |
234 bitrate_estimator_->IncomingPacket(arrival_time + kArrivalTimeClockOffsetMs, | |
235 payload_size, header); | |
236 } | 185 } |
237 | 186 |
238 // Generates a frame of packets belonging to a stream at a given bitrate and | 187 // Generates a frame of packets belonging to a stream at a given bitrate and |
239 // with a given ssrc. The stream is pushed through a very simple simulated | 188 // with a given ssrc. The stream is pushed through a very simple simulated |
240 // network, and is then given to the receive-side bandwidth estimator. | 189 // network, and is then given to the receive-side bandwidth estimator. |
241 // Returns true if an over-use was seen, false otherwise. | 190 // Returns true if an over-use was seen, false otherwise. |
242 // The StreamGenerator::updated() should be used to check for any changes in | 191 // The StreamGenerator::updated() should be used to check for any changes in |
243 // target bitrate after the call to this function. | 192 // target bitrate after the call to this function. |
244 bool RemoteBitrateEstimatorTest::GenerateAndProcessFrame(uint32_t ssrc, | 193 bool DelayBasedBweTest::GenerateAndProcessFrame(uint32_t ssrc, |
245 uint32_t bitrate_bps) { | 194 uint32_t bitrate_bps) { |
246 stream_generator_->SetBitrateBps(bitrate_bps); | 195 stream_generator_->SetBitrateBps(bitrate_bps); |
247 testing::RtpStream::PacketList packets; | 196 std::vector<PacketInfo> packets; |
248 int64_t next_time_us = stream_generator_->GenerateFrame( | 197 int64_t next_time_us = |
249 &packets, clock_.TimeInMicroseconds()); | 198 stream_generator_->GenerateFrame(&packets, clock_.TimeInMicroseconds()); |
199 if (packets.empty()) | |
200 return false; | |
201 | |
250 bool overuse = false; | 202 bool overuse = false; |
251 while (!packets.empty()) { | 203 bitrate_observer_->Reset(); |
252 testing::RtpStream::RtpPacket* packet = packets.front(); | 204 clock_.AdvanceTimeMicroseconds(1000 * packets.back().arrival_time_ms - |
253 bitrate_observer_->Reset(); | 205 clock_.TimeInMicroseconds()); |
254 // The simulated clock should match the time of packet->arrival_time | 206 for (auto& packet : packets) { |
255 // since both are used in IncomingPacket(). | 207 packet.arrival_time_ms += arrival_time_offset_ms_; |
256 clock_.AdvanceTimeMicroseconds(packet->arrival_time - | |
257 clock_.TimeInMicroseconds()); | |
258 IncomingPacket(packet->ssrc, packet->size, | |
259 (packet->arrival_time + 500) / 1000, packet->rtp_timestamp, | |
260 AbsSendTime(packet->send_time, 1000000)); | |
261 if (bitrate_observer_->updated()) { | |
262 if (bitrate_observer_->latest_bitrate() < bitrate_bps) | |
263 overuse = true; | |
264 } | |
265 delete packet; | |
266 packets.pop_front(); | |
267 } | 208 } |
268 bitrate_estimator_->Process(); | 209 bitrate_estimator_->IncomingPacketFeedbackVector(packets); |
210 | |
211 if (bitrate_observer_->updated()) { | |
212 if (bitrate_observer_->latest_bitrate() < bitrate_bps) | |
213 overuse = true; | |
214 } | |
215 | |
269 clock_.AdvanceTimeMicroseconds(next_time_us - clock_.TimeInMicroseconds()); | 216 clock_.AdvanceTimeMicroseconds(next_time_us - clock_.TimeInMicroseconds()); |
270 return overuse; | 217 return overuse; |
271 } | 218 } |
272 | 219 |
273 // Run the bandwidth estimator with a stream of |number_of_frames| frames, or | 220 // Run the bandwidth estimator with a stream of |number_of_frames| frames, or |
274 // until it reaches |target_bitrate|. | 221 // until it reaches |target_bitrate|. |
275 // Can for instance be used to run the estimator for some time to get it | 222 // Can for instance be used to run the estimator for some time to get it |
276 // into a steady state. | 223 // into a steady state. |
277 uint32_t RemoteBitrateEstimatorTest::SteadyStateRun(uint32_t ssrc, | 224 uint32_t DelayBasedBweTest::SteadyStateRun(uint32_t ssrc, |
278 int max_number_of_frames, | 225 int max_number_of_frames, |
279 uint32_t start_bitrate, | 226 uint32_t start_bitrate, |
280 uint32_t min_bitrate, | 227 uint32_t min_bitrate, |
281 uint32_t max_bitrate, | 228 uint32_t max_bitrate, |
282 uint32_t target_bitrate) { | 229 uint32_t target_bitrate) { |
283 uint32_t bitrate_bps = start_bitrate; | 230 uint32_t bitrate_bps = start_bitrate; |
284 bool bitrate_update_seen = false; | 231 bool bitrate_update_seen = false; |
285 // Produce |number_of_frames| frames and give them to the estimator. | 232 // Produce |number_of_frames| frames and give them to the estimator. |
286 for (int i = 0; i < max_number_of_frames; ++i) { | 233 for (int i = 0; i < max_number_of_frames; ++i) { |
287 bool overuse = GenerateAndProcessFrame(ssrc, bitrate_bps); | 234 bool overuse = GenerateAndProcessFrame(ssrc, bitrate_bps); |
288 if (overuse) { | 235 if (overuse) { |
289 EXPECT_LT(bitrate_observer_->latest_bitrate(), max_bitrate); | 236 EXPECT_LT(bitrate_observer_->latest_bitrate(), max_bitrate); |
290 EXPECT_GT(bitrate_observer_->latest_bitrate(), min_bitrate); | 237 EXPECT_GT(bitrate_observer_->latest_bitrate(), min_bitrate); |
291 bitrate_bps = bitrate_observer_->latest_bitrate(); | 238 bitrate_bps = bitrate_observer_->latest_bitrate(); |
292 bitrate_update_seen = true; | 239 bitrate_update_seen = true; |
293 } else if (bitrate_observer_->updated()) { | 240 } else if (bitrate_observer_->updated()) { |
294 bitrate_bps = bitrate_observer_->latest_bitrate(); | 241 bitrate_bps = bitrate_observer_->latest_bitrate(); |
295 bitrate_observer_->Reset(); | 242 bitrate_observer_->Reset(); |
296 } | 243 } |
297 if (bitrate_update_seen && bitrate_bps > target_bitrate) { | 244 if (bitrate_update_seen && bitrate_bps > target_bitrate) { |
298 break; | 245 break; |
299 } | 246 } |
300 } | 247 } |
301 EXPECT_TRUE(bitrate_update_seen); | 248 EXPECT_TRUE(bitrate_update_seen); |
302 return bitrate_bps; | 249 return bitrate_bps; |
303 } | 250 } |
304 | 251 |
305 void RemoteBitrateEstimatorTest::InitialBehaviorTestHelper( | 252 void DelayBasedBweTest::InitialBehaviorTestHelper( |
306 uint32_t expected_converge_bitrate) { | 253 uint32_t expected_converge_bitrate) { |
307 const int kFramerate = 50; // 50 fps to avoid rounding errors. | 254 const int kFramerate = 50; // 50 fps to avoid rounding errors. |
308 const int kFrameIntervalMs = 1000 / kFramerate; | 255 const int kFrameIntervalMs = 1000 / kFramerate; |
309 const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); | |
310 uint32_t bitrate_bps = 0; | 256 uint32_t bitrate_bps = 0; |
311 uint32_t timestamp = 0; | 257 int64_t send_time_ms = 0; |
312 uint32_t absolute_send_time = 0; | 258 uint16_t sequence_number = 0; |
313 std::vector<uint32_t> ssrcs; | 259 std::vector<uint32_t> ssrcs; |
314 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); | 260 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); |
315 EXPECT_EQ(0u, ssrcs.size()); | 261 EXPECT_EQ(0u, ssrcs.size()); |
316 clock_.AdvanceTimeMilliseconds(1000); | 262 clock_.AdvanceTimeMilliseconds(1000); |
317 bitrate_estimator_->Process(); | 263 bitrate_estimator_->Process(); |
318 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); | 264 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); |
319 EXPECT_FALSE(bitrate_observer_->updated()); | 265 EXPECT_FALSE(bitrate_observer_->updated()); |
320 bitrate_observer_->Reset(); | 266 bitrate_observer_->Reset(); |
321 clock_.AdvanceTimeMilliseconds(1000); | 267 clock_.AdvanceTimeMilliseconds(1000); |
322 // Inserting packets for 5 seconds to get a valid estimate. | 268 // Inserting packets for 5 seconds to get a valid estimate. |
323 for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) { | 269 for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) { |
324 if (i == kNumInitialPackets) { | 270 if (i == kNumInitialPackets) { |
325 bitrate_estimator_->Process(); | 271 bitrate_estimator_->Process(); |
326 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); | 272 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); |
327 EXPECT_EQ(0u, ssrcs.size()); | 273 EXPECT_EQ(0u, ssrcs.size()); |
328 EXPECT_FALSE(bitrate_observer_->updated()); | 274 EXPECT_FALSE(bitrate_observer_->updated()); |
329 bitrate_observer_->Reset(); | 275 bitrate_observer_->Reset(); |
330 } | 276 } |
331 | 277 |
332 IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp, | 278 IncomingPacket(kMtu, clock_.TimeInMilliseconds(), send_time_ms, |
333 absolute_send_time); | 279 sequence_number++); |
334 clock_.AdvanceTimeMilliseconds(1000 / kFramerate); | 280 clock_.AdvanceTimeMilliseconds(1000 / kFramerate); |
335 timestamp += 90 * kFrameIntervalMs; | 281 send_time_ms += kFrameIntervalMs; |
336 absolute_send_time = AddAbsSendTime(absolute_send_time, | |
337 kFrameIntervalAbsSendTime); | |
338 } | 282 } |
339 bitrate_estimator_->Process(); | 283 bitrate_estimator_->Process(); |
340 EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); | 284 EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); |
341 ASSERT_EQ(1u, ssrcs.size()); | 285 ASSERT_EQ(1u, ssrcs.size()); |
342 EXPECT_EQ(kDefaultSsrc, ssrcs.front()); | 286 EXPECT_EQ(kDefaultSsrc, ssrcs.front()); |
343 EXPECT_NEAR(expected_converge_bitrate, bitrate_bps, kAcceptedBitrateErrorBps); | 287 EXPECT_NEAR(expected_converge_bitrate, bitrate_bps, kAcceptedBitrateErrorBps); |
344 EXPECT_TRUE(bitrate_observer_->updated()); | 288 EXPECT_TRUE(bitrate_observer_->updated()); |
345 bitrate_observer_->Reset(); | 289 bitrate_observer_->Reset(); |
346 EXPECT_EQ(bitrate_observer_->latest_bitrate(), bitrate_bps); | 290 EXPECT_EQ(bitrate_observer_->latest_bitrate(), bitrate_bps); |
347 bitrate_estimator_->RemoveStream(kDefaultSsrc); | 291 bitrate_estimator_->RemoveStream(kDefaultSsrc); |
348 EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); | 292 EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); |
349 ASSERT_EQ(0u, ssrcs.size()); | 293 ASSERT_EQ(0u, ssrcs.size()); |
350 EXPECT_EQ(0u, bitrate_bps); | 294 EXPECT_EQ(0u, bitrate_bps); |
351 } | 295 } |
352 | 296 |
353 void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper( | 297 void DelayBasedBweTest::RateIncreaseReorderingTestHelper( |
354 uint32_t expected_bitrate_bps) { | 298 uint32_t expected_bitrate_bps) { |
355 const int kFramerate = 50; // 50 fps to avoid rounding errors. | 299 const int kFramerate = 50; // 50 fps to avoid rounding errors. |
356 const int kFrameIntervalMs = 1000 / kFramerate; | 300 const int kFrameIntervalMs = 1000 / kFramerate; |
357 const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); | 301 int64_t send_time_ms = 0; |
358 uint32_t timestamp = 0; | 302 uint16_t sequence_number = 0; |
359 uint32_t absolute_send_time = 0; | |
360 // Inserting packets for five seconds to get a valid estimate. | 303 // Inserting packets for five seconds to get a valid estimate. |
361 for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) { | 304 for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) { |
362 // TODO(sprang): Remove this hack once the single stream estimator is gone, | 305 // TODO(sprang): Remove this hack once the single stream estimator is gone, |
363 // as it doesn't do anything in Process(). | 306 // as it doesn't do anything in Process(). |
364 if (i == kNumInitialPackets) { | 307 if (i == kNumInitialPackets) { |
365 // Process after we have enough frames to get a valid input rate estimate. | 308 // Process after we have enough frames to get a valid input rate estimate. |
366 bitrate_estimator_->Process(); | 309 bitrate_estimator_->Process(); |
367 EXPECT_FALSE(bitrate_observer_->updated()); // No valid estimate. | 310 EXPECT_FALSE(bitrate_observer_->updated()); // No valid estimate. |
368 } | 311 } |
369 | 312 |
370 IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp, | 313 IncomingPacket(kMtu, clock_.TimeInMilliseconds(), send_time_ms, |
371 absolute_send_time); | 314 sequence_number++); |
372 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); | 315 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); |
373 timestamp += 90 * kFrameIntervalMs; | 316 send_time_ms += kFrameIntervalMs; |
374 absolute_send_time = AddAbsSendTime(absolute_send_time, | |
375 kFrameIntervalAbsSendTime); | |
376 } | 317 } |
377 bitrate_estimator_->Process(); | 318 bitrate_estimator_->Process(); |
378 EXPECT_TRUE(bitrate_observer_->updated()); | 319 EXPECT_TRUE(bitrate_observer_->updated()); |
379 EXPECT_NEAR(expected_bitrate_bps, | 320 EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_->latest_bitrate(), |
380 bitrate_observer_->latest_bitrate(), | |
381 kAcceptedBitrateErrorBps); | 321 kAcceptedBitrateErrorBps); |
382 for (int i = 0; i < 10; ++i) { | 322 for (int i = 0; i < 10; ++i) { |
383 clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs); | 323 clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs); |
384 timestamp += 2 * 90 * kFrameIntervalMs; | 324 send_time_ms += 2 * kFrameIntervalMs; |
385 absolute_send_time = AddAbsSendTime(absolute_send_time, | 325 IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
386 2 * kFrameIntervalAbsSendTime); | 326 sequence_number + 2); |
387 IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, | 327 IncomingPacket(1000, clock_.TimeInMilliseconds(), |
388 absolute_send_time); | 328 send_time_ms - kFrameIntervalMs, sequence_number + 1); |
389 IncomingPacket( | 329 sequence_number += 2; |
390 kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), | |
391 timestamp - 90 * kFrameIntervalMs, | |
392 AddAbsSendTime(absolute_send_time, | |
393 -static_cast<int>(kFrameIntervalAbsSendTime))); | |
394 } | 330 } |
395 bitrate_estimator_->Process(); | 331 bitrate_estimator_->Process(); |
396 EXPECT_TRUE(bitrate_observer_->updated()); | 332 EXPECT_TRUE(bitrate_observer_->updated()); |
397 EXPECT_NEAR(expected_bitrate_bps, | 333 EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_->latest_bitrate(), |
398 bitrate_observer_->latest_bitrate(), | |
399 kAcceptedBitrateErrorBps); | 334 kAcceptedBitrateErrorBps); |
400 } | 335 } |
401 | 336 |
402 // Make sure we initially increase the bitrate as expected. | 337 // Make sure we initially increase the bitrate as expected. |
403 void RemoteBitrateEstimatorTest::RateIncreaseRtpTimestampsTestHelper( | 338 void DelayBasedBweTest::RateIncreaseRtpTimestampsTestHelper( |
404 int expected_iterations) { | 339 int expected_iterations) { |
405 // This threshold corresponds approximately to increasing linearly with | 340 // This threshold corresponds approximately to increasing linearly with |
406 // bitrate(i) = 1.04 * bitrate(i-1) + 1000 | 341 // bitrate(i) = 1.04 * bitrate(i-1) + 1000 |
407 // until bitrate(i) > 500000, with bitrate(1) ~= 30000. | 342 // until bitrate(i) > 500000, with bitrate(1) ~= 30000. |
408 uint32_t bitrate_bps = 30000; | 343 uint32_t bitrate_bps = 30000; |
409 int iterations = 0; | 344 int iterations = 0; |
410 AddDefaultStream(); | 345 AddDefaultStream(); |
411 // Feed the estimator with a stream of packets and verify that it reaches | 346 // Feed the estimator with a stream of packets and verify that it reaches |
412 // 500 kbps at the expected time. | 347 // 500 kbps at the expected time. |
413 while (bitrate_bps < 5e5) { | 348 while (bitrate_bps < 5e5) { |
414 bool overuse = GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps); | 349 bool overuse = GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps); |
415 if (overuse) { | 350 if (overuse) { |
416 EXPECT_GT(bitrate_observer_->latest_bitrate(), bitrate_bps); | 351 EXPECT_GT(bitrate_observer_->latest_bitrate(), bitrate_bps); |
417 bitrate_bps = bitrate_observer_->latest_bitrate(); | 352 bitrate_bps = bitrate_observer_->latest_bitrate(); |
418 bitrate_observer_->Reset(); | 353 bitrate_observer_->Reset(); |
419 } else if (bitrate_observer_->updated()) { | 354 } else if (bitrate_observer_->updated()) { |
420 bitrate_bps = bitrate_observer_->latest_bitrate(); | 355 bitrate_bps = bitrate_observer_->latest_bitrate(); |
421 bitrate_observer_->Reset(); | 356 bitrate_observer_->Reset(); |
422 } | 357 } |
423 ++iterations; | 358 ++iterations; |
424 ASSERT_LE(iterations, expected_iterations); | 359 ASSERT_LE(iterations, expected_iterations); |
425 } | 360 } |
426 ASSERT_EQ(expected_iterations, iterations); | 361 ASSERT_EQ(expected_iterations, iterations); |
427 } | 362 } |
428 | 363 |
429 void RemoteBitrateEstimatorTest::CapacityDropTestHelper( | 364 void DelayBasedBweTest::CapacityDropTestHelper( |
430 int number_of_streams, | 365 int number_of_streams, |
431 bool wrap_time_stamp, | 366 bool wrap_time_stamp, |
432 uint32_t expected_bitrate_drop_delta) { | 367 uint32_t expected_bitrate_drop_delta, |
368 int64_t receiver_clock_offset_change_ms) { | |
433 const int kFramerate = 30; | 369 const int kFramerate = 30; |
434 const int kStartBitrate = 900e3; | 370 const int kStartBitrate = 900e3; |
435 const int kMinExpectedBitrate = 800e3; | 371 const int kMinExpectedBitrate = 800e3; |
436 const int kMaxExpectedBitrate = 1100e3; | 372 const int kMaxExpectedBitrate = 1100e3; |
437 const uint32_t kInitialCapacityBps = 1000e3; | 373 const uint32_t kInitialCapacityBps = 1000e3; |
438 const uint32_t kReducedCapacityBps = 500e3; | 374 const uint32_t kReducedCapacityBps = 500e3; |
439 | 375 |
440 int steady_state_time = 0; | 376 int steady_state_time = 0; |
441 if (number_of_streams <= 1) { | 377 if (number_of_streams <= 1) { |
442 steady_state_time = 10; | 378 steady_state_time = 10; |
443 AddDefaultStream(); | 379 AddDefaultStream(); |
444 } else { | 380 } else { |
445 steady_state_time = 10 * number_of_streams; | 381 steady_state_time = 10 * number_of_streams; |
446 int bitrate_sum = 0; | 382 int bitrate_sum = 0; |
447 int kBitrateDenom = number_of_streams * (number_of_streams - 1); | 383 int kBitrateDenom = number_of_streams * (number_of_streams - 1); |
448 for (int i = 0; i < number_of_streams; i++) { | 384 for (int i = 0; i < number_of_streams; i++) { |
449 // First stream gets half available bitrate, while the rest share the | 385 // First stream gets half available bitrate, while the rest share the |
450 // remaining half i.e.: 1/2 = Sum[n/(N*(N-1))] for n=1..N-1 (rounded up) | 386 // remaining half i.e.: 1/2 = Sum[n/(N*(N-1))] for n=1..N-1 (rounded up) |
451 int bitrate = kStartBitrate / 2; | 387 int bitrate = kStartBitrate / 2; |
452 if (i > 0) { | 388 if (i > 0) { |
453 bitrate = (kStartBitrate * i + kBitrateDenom / 2) / kBitrateDenom; | 389 bitrate = (kStartBitrate * i + kBitrateDenom / 2) / kBitrateDenom; |
454 } | 390 } |
455 uint32_t mask = ~0ull << (32 - i); | 391 stream_generator_->AddStream(new test::RtpStream(kFramerate, bitrate)); |
456 stream_generator_->AddStream( | |
457 new testing::RtpStream(kFramerate, // Frames per second. | |
458 bitrate, // Bitrate. | |
459 kDefaultSsrc + i, // SSRC. | |
460 90000, // RTP frequency. | |
461 0xFFFFF000u ^ mask, // Timestamp offset. | |
462 0)); // RTCP receive time. | |
463 bitrate_sum += bitrate; | 392 bitrate_sum += bitrate; |
464 } | 393 } |
465 ASSERT_EQ(bitrate_sum, kStartBitrate); | 394 ASSERT_EQ(bitrate_sum, kStartBitrate); |
466 } | 395 } |
467 if (wrap_time_stamp) { | |
468 stream_generator_->set_rtp_timestamp_offset(kDefaultSsrc, | |
469 std::numeric_limits<uint32_t>::max() - steady_state_time * 90000); | |
470 } | |
471 | 396 |
472 // Run in steady state to make the estimator converge. | 397 // Run in steady state to make the estimator converge. |
473 stream_generator_->set_capacity_bps(kInitialCapacityBps); | 398 stream_generator_->set_capacity_bps(kInitialCapacityBps); |
474 uint32_t bitrate_bps = SteadyStateRun( | 399 uint32_t bitrate_bps = SteadyStateRun( |
475 kDefaultSsrc, steady_state_time * kFramerate, kStartBitrate, | 400 kDefaultSsrc, steady_state_time * kFramerate, kStartBitrate, |
476 kMinExpectedBitrate, kMaxExpectedBitrate, kInitialCapacityBps); | 401 kMinExpectedBitrate, kMaxExpectedBitrate, kInitialCapacityBps); |
477 EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 130000u); | 402 EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 130000u); |
478 bitrate_observer_->Reset(); | 403 bitrate_observer_->Reset(); |
479 | 404 |
405 // Add an offset to make sure the BWE can handle it. | |
406 arrival_time_offset_ms_ += receiver_clock_offset_change_ms; | |
407 | |
480 // Reduce the capacity and verify the decrease time. | 408 // Reduce the capacity and verify the decrease time. |
481 stream_generator_->set_capacity_bps(kReducedCapacityBps); | 409 stream_generator_->set_capacity_bps(kReducedCapacityBps); |
482 int64_t overuse_start_time = clock_.TimeInMilliseconds(); | 410 int64_t overuse_start_time = clock_.TimeInMilliseconds(); |
483 int64_t bitrate_drop_time = -1; | 411 int64_t bitrate_drop_time = -1; |
484 for (int i = 0; i < 100 * number_of_streams; ++i) { | 412 for (int i = 0; i < 100 * number_of_streams; ++i) { |
485 GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps); | 413 GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps); |
486 if (bitrate_drop_time == -1 && | 414 if (bitrate_drop_time == -1 && |
487 bitrate_observer_->latest_bitrate() <= kReducedCapacityBps) { | 415 bitrate_observer_->latest_bitrate() <= kReducedCapacityBps) { |
488 bitrate_drop_time = clock_.TimeInMilliseconds(); | 416 bitrate_drop_time = clock_.TimeInMilliseconds(); |
489 } | 417 } |
490 bitrate_bps = bitrate_observer_->latest_bitrate(); | 418 bitrate_bps = bitrate_observer_->latest_bitrate(); |
491 } | 419 } |
492 | 420 |
493 EXPECT_NEAR(expected_bitrate_drop_delta, | 421 EXPECT_NEAR(expected_bitrate_drop_delta, |
494 bitrate_drop_time - overuse_start_time, 33); | 422 bitrate_drop_time - overuse_start_time, 33); |
495 | |
496 // Remove stream one by one. | |
497 uint32_t latest_bps = 0; | |
498 std::vector<uint32_t> ssrcs; | |
499 for (int i = 0; i < number_of_streams; i++) { | |
500 EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &latest_bps)); | |
501 EXPECT_EQ(number_of_streams - i, static_cast<int>(ssrcs.size())); | |
502 EXPECT_EQ(bitrate_bps, latest_bps); | |
503 for (int j = i; j < number_of_streams; j++) { | |
504 EXPECT_EQ(kDefaultSsrc + j, ssrcs[j - i]); | |
505 } | |
506 bitrate_estimator_->RemoveStream(kDefaultSsrc + i); | |
507 } | |
508 EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &latest_bps)); | |
509 EXPECT_EQ(0u, ssrcs.size()); | |
510 EXPECT_EQ(0u, latest_bps); | |
511 } | 423 } |
512 | 424 |
513 void RemoteBitrateEstimatorTest::TestTimestampGroupingTestHelper() { | 425 void DelayBasedBweTest::TestTimestampGroupingTestHelper() { |
514 const int kFramerate = 50; // 50 fps to avoid rounding errors. | 426 const int kFramerate = 50; // 50 fps to avoid rounding errors. |
515 const int kFrameIntervalMs = 1000 / kFramerate; | 427 const int kFrameIntervalMs = 1000 / kFramerate; |
516 const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); | 428 int64_t send_time_ms = 0; |
517 uint32_t timestamp = 0; | 429 uint16_t sequence_number = 0; |
518 // Initialize absolute_send_time (24 bits) so that it will definitely wrap | |
519 // during the test. | |
520 uint32_t absolute_send_time = AddAbsSendTime( | |
521 (1 << 24), -static_cast<int>(50 * kFrameIntervalAbsSendTime)); | |
522 // Initial set of frames to increase the bitrate. 6 seconds to have enough | 430 // Initial set of frames to increase the bitrate. 6 seconds to have enough |
523 // time for the first estimate to be generated and for Process() to be called. | 431 // time for the first estimate to be generated and for Process() to be called. |
524 for (int i = 0; i <= 6 * kFramerate; ++i) { | 432 for (int i = 0; i <= 6 * kFramerate; ++i) { |
525 IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, | 433 IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
526 absolute_send_time); | 434 sequence_number++); |
435 | |
527 bitrate_estimator_->Process(); | 436 bitrate_estimator_->Process(); |
528 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); | 437 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); |
529 timestamp += 90 * kFrameIntervalMs; | 438 send_time_ms += kFrameIntervalMs; |
530 absolute_send_time = AddAbsSendTime(absolute_send_time, | |
531 kFrameIntervalAbsSendTime); | |
532 } | 439 } |
533 EXPECT_TRUE(bitrate_observer_->updated()); | 440 EXPECT_TRUE(bitrate_observer_->updated()); |
534 EXPECT_GE(bitrate_observer_->latest_bitrate(), 400000u); | 441 EXPECT_GE(bitrate_observer_->latest_bitrate(), 400000u); |
535 | 442 |
536 // Insert batches of frames which were sent very close in time. Also simulate | 443 // Insert batches of frames which were sent very close in time. Also simulate |
537 // capacity over-use to see that we back off correctly. | 444 // capacity over-use to see that we back off correctly. |
538 const int kTimestampGroupLength = 15; | 445 const int kTimestampGroupLength = 15; |
539 const uint32_t kTimestampGroupLengthAbsSendTime = | |
540 AbsSendTime(kTimestampGroupLength, 90000); | |
541 const uint32_t kSingleRtpTickAbsSendTime = AbsSendTime(1, 90000); | |
542 for (int i = 0; i < 100; ++i) { | 446 for (int i = 0; i < 100; ++i) { |
543 for (int j = 0; j < kTimestampGroupLength; ++j) { | 447 for (int j = 0; j < kTimestampGroupLength; ++j) { |
544 // Insert |kTimestampGroupLength| frames with just 1 timestamp ticks in | 448 // Insert |kTimestampGroupLength| frames with just 1 timestamp ticks in |
545 // between. Should be treated as part of the same group by the estimator. | 449 // between. Should be treated as part of the same group by the estimator. |
546 IncomingPacket(kDefaultSsrc, 100, clock_.TimeInMilliseconds(), timestamp, | 450 IncomingPacket(100, clock_.TimeInMilliseconds(), send_time_ms, |
547 absolute_send_time); | 451 sequence_number++); |
548 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength); | 452 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength); |
549 timestamp += 1; | 453 send_time_ms += 1; |
550 absolute_send_time = AddAbsSendTime(absolute_send_time, | |
551 kSingleRtpTickAbsSendTime); | |
552 } | 454 } |
553 // Increase time until next batch to simulate over-use. | 455 // Increase time until next batch to simulate over-use. |
554 clock_.AdvanceTimeMilliseconds(10); | 456 clock_.AdvanceTimeMilliseconds(10); |
555 timestamp += 90 * kFrameIntervalMs - kTimestampGroupLength; | 457 send_time_ms += kFrameIntervalMs - kTimestampGroupLength; |
556 absolute_send_time = AddAbsSendTime( | |
557 absolute_send_time, | |
558 AddAbsSendTime(kFrameIntervalAbsSendTime, | |
559 -static_cast<int>(kTimestampGroupLengthAbsSendTime))); | |
560 bitrate_estimator_->Process(); | 458 bitrate_estimator_->Process(); |
561 } | 459 } |
562 EXPECT_TRUE(bitrate_observer_->updated()); | 460 EXPECT_TRUE(bitrate_observer_->updated()); |
563 // Should have reduced the estimate. | 461 // Should have reduced the estimate. |
564 EXPECT_LT(bitrate_observer_->latest_bitrate(), 400000u); | 462 EXPECT_LT(bitrate_observer_->latest_bitrate(), 400000u); |
565 } | 463 } |
566 | 464 |
567 void RemoteBitrateEstimatorTest::TestWrappingHelper( | 465 void DelayBasedBweTest::TestWrappingHelper(int silence_time_s) { |
568 int silence_time_s) { | |
569 const int kFramerate = 100; | 466 const int kFramerate = 100; |
570 const int kFrameIntervalMs = 1000 / kFramerate; | 467 const int kFrameIntervalMs = 1000 / kFramerate; |
571 const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); | 468 int64_t send_time_ms = 0; |
572 uint32_t absolute_send_time = 0; | 469 uint16_t sequence_number = 0; |
573 uint32_t timestamp = 0; | |
574 | 470 |
575 for (size_t i = 0; i < 3000; ++i) { | 471 for (size_t i = 0; i < 3000; ++i) { |
576 IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, | 472 IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
577 absolute_send_time); | 473 sequence_number++); |
578 timestamp += kFrameIntervalMs; | |
579 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); | 474 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); |
580 absolute_send_time = AddAbsSendTime(absolute_send_time, | 475 send_time_ms += kFrameIntervalMs; |
581 kFrameIntervalAbsSendTime); | |
582 bitrate_estimator_->Process(); | 476 bitrate_estimator_->Process(); |
583 } | 477 } |
584 uint32_t bitrate_before = 0; | 478 uint32_t bitrate_before = 0; |
585 std::vector<uint32_t> ssrcs; | 479 std::vector<uint32_t> ssrcs; |
586 bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_before); | 480 bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_before); |
587 | 481 |
588 clock_.AdvanceTimeMilliseconds(silence_time_s * 1000); | 482 clock_.AdvanceTimeMilliseconds(silence_time_s * 1000); |
589 absolute_send_time = AddAbsSendTime(absolute_send_time, | 483 send_time_ms += silence_time_s * 1000; |
590 AbsSendTime(silence_time_s, 1)); | |
591 bitrate_estimator_->Process(); | 484 bitrate_estimator_->Process(); |
485 | |
592 for (size_t i = 0; i < 21; ++i) { | 486 for (size_t i = 0; i < 21; ++i) { |
593 IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, | 487 IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
594 absolute_send_time); | 488 sequence_number++); |
595 timestamp += kFrameIntervalMs; | |
596 clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs); | 489 clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs); |
597 absolute_send_time = AddAbsSendTime(absolute_send_time, | 490 send_time_ms += kFrameIntervalMs; |
598 kFrameIntervalAbsSendTime); | |
599 bitrate_estimator_->Process(); | 491 bitrate_estimator_->Process(); |
600 } | 492 } |
601 uint32_t bitrate_after = 0; | 493 uint32_t bitrate_after = 0; |
602 bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_after); | 494 bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_after); |
603 EXPECT_LT(bitrate_after, bitrate_before); | 495 EXPECT_LT(bitrate_after, bitrate_before); |
604 } | 496 } |
605 } // namespace webrtc | 497 } // namespace webrtc |
OLD | NEW |