1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10 #include "modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h"
11
12 #include <algorithm>
13 #include <cstdint>
14 #include <memory>
15
16 #include "absl/strings/string_view.h"
17 #include "modules/congestion_controller/goog_cc/delay_based_bwe.h"
18 #include "rtc_base/checks.h"
19
20 namespace webrtc {
21 constexpr size_t kMtu = 1200;
22 constexpr uint32_t kAcceptedBitrateErrorBps = 50000;
23
24 // Number of packets needed before we have a valid estimate.
25 constexpr int kNumInitialPackets = 2;
26
27 constexpr int kInitialProbingPackets = 5;
28
29 namespace test {
30
OnReceiveBitrateChanged(uint32_t bitrate)31 void TestBitrateObserver::OnReceiveBitrateChanged(uint32_t bitrate) {
32 latest_bitrate_ = bitrate;
33 updated_ = true;
34 }
35
RtpStream(int fps,int bitrate_bps)36 RtpStream::RtpStream(int fps, int bitrate_bps)
37 : fps_(fps), bitrate_bps_(bitrate_bps), next_rtp_time_(0) {
38 RTC_CHECK_GT(fps_, 0);
39 }
40
41 // Generates a new frame for this stream. If called too soon after the
42 // previous frame, no frame will be generated. The frame is split into
43 // packets.
GenerateFrame(int64_t time_now_us,std::vector<PacketResult> * packets)44 int64_t RtpStream::GenerateFrame(int64_t time_now_us,
45 std::vector<PacketResult>* packets) {
46 if (time_now_us < next_rtp_time_) {
47 return next_rtp_time_;
48 }
49 RTC_CHECK(packets != NULL);
50 size_t bits_per_frame = (bitrate_bps_ + fps_ / 2) / fps_;
51 size_t n_packets =
52 std::max<size_t>((bits_per_frame + 4 * kMtu) / (8 * kMtu), 1u);
53 size_t payload_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets);
54 for (size_t i = 0; i < n_packets; ++i) {
55 PacketResult packet;
56 packet.sent_packet.send_time =
57 Timestamp::Micros(time_now_us + kSendSideOffsetUs);
58 packet.sent_packet.size = DataSize::Bytes(payload_size);
59 packets->push_back(packet);
60 }
61 next_rtp_time_ = time_now_us + (1000000 + fps_ / 2) / fps_;
62 return next_rtp_time_;
63 }
64
65 // The send-side time when the next frame can be generated.
next_rtp_time() const66 int64_t RtpStream::next_rtp_time() const {
67 return next_rtp_time_;
68 }
69
set_bitrate_bps(int bitrate_bps)70 void RtpStream::set_bitrate_bps(int bitrate_bps) {
71 ASSERT_GE(bitrate_bps, 0);
72 bitrate_bps_ = bitrate_bps;
73 }
74
bitrate_bps() const75 int RtpStream::bitrate_bps() const {
76 return bitrate_bps_;
77 }
78
Compare(const std::unique_ptr<RtpStream> & lhs,const std::unique_ptr<RtpStream> & rhs)79 bool RtpStream::Compare(const std::unique_ptr<RtpStream>& lhs,
80 const std::unique_ptr<RtpStream>& rhs) {
81 return lhs->next_rtp_time_ < rhs->next_rtp_time_;
82 }
83
StreamGenerator(int capacity,int64_t time_now)84 StreamGenerator::StreamGenerator(int capacity, int64_t time_now)
85 : capacity_(capacity), prev_arrival_time_us_(time_now) {}
86
87 StreamGenerator::~StreamGenerator() = default;
88
89 // Add a new stream.
AddStream(RtpStream * stream)90 void StreamGenerator::AddStream(RtpStream* stream) {
91 streams_.push_back(std::unique_ptr<RtpStream>(stream));
92 }
93
94 // Set the link capacity.
set_capacity_bps(int capacity_bps)95 void StreamGenerator::set_capacity_bps(int capacity_bps) {
96 ASSERT_GT(capacity_bps, 0);
97 capacity_ = capacity_bps;
98 }
99
100 // Divides `bitrate_bps` among all streams. The allocated bitrate per stream
101 // is decided by the current allocation ratios.
SetBitrateBps(int bitrate_bps)102 void StreamGenerator::SetBitrateBps(int bitrate_bps) {
103 ASSERT_GE(streams_.size(), 0u);
104 int total_bitrate_before = 0;
105 for (const auto& stream : streams_) {
106 total_bitrate_before += stream->bitrate_bps();
107 }
108 int64_t bitrate_before = 0;
109 int total_bitrate_after = 0;
110 for (const auto& stream : streams_) {
111 bitrate_before += stream->bitrate_bps();
112 int64_t bitrate_after =
113 (bitrate_before * bitrate_bps + total_bitrate_before / 2) /
114 total_bitrate_before;
115 stream->set_bitrate_bps(bitrate_after - total_bitrate_after);
116 total_bitrate_after += stream->bitrate_bps();
117 }
118 ASSERT_EQ(bitrate_before, total_bitrate_before);
119 EXPECT_EQ(total_bitrate_after, bitrate_bps);
120 }
121
122 // TODO(holmer): Break out the channel simulation part from this class to make
123 // it possible to simulate different types of channels.
GenerateFrame(std::vector<PacketResult> * packets,int64_t time_now_us)124 int64_t StreamGenerator::GenerateFrame(std::vector<PacketResult>* packets,
125 int64_t time_now_us) {
126 RTC_CHECK(packets != NULL);
127 RTC_CHECK(packets->empty());
128 RTC_CHECK_GT(capacity_, 0);
129 auto it =
130 std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare);
131 (*it)->GenerateFrame(time_now_us, packets);
132 for (PacketResult& packet : *packets) {
133 int capacity_bpus = capacity_ / 1000;
134 int64_t required_network_time_us =
135 (8 * 1000 * packet.sent_packet.size.bytes() + capacity_bpus / 2) /
136 capacity_bpus;
137 prev_arrival_time_us_ =
138 std::max(time_now_us + required_network_time_us,
139 prev_arrival_time_us_ + required_network_time_us);
140 packet.receive_time = Timestamp::Micros(prev_arrival_time_us_);
141 }
142 it = std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare);
143 return std::max((*it)->next_rtp_time(), time_now_us);
144 }
145 } // namespace test
146
DelayBasedBweTest()147 DelayBasedBweTest::DelayBasedBweTest() : DelayBasedBweTest("") {}
148
DelayBasedBweTest(absl::string_view field_trial_string)149 DelayBasedBweTest::DelayBasedBweTest(absl::string_view field_trial_string)
150 : field_trial(
151 std::make_unique<test::ScopedFieldTrials>(field_trial_string)),
152 clock_(100000000),
153 acknowledged_bitrate_estimator_(
154 AcknowledgedBitrateEstimatorInterface::Create(&field_trial_config_)),
155 probe_bitrate_estimator_(new ProbeBitrateEstimator(nullptr)),
156 bitrate_estimator_(
157 new DelayBasedBwe(&field_trial_config_, nullptr, nullptr)),
158 stream_generator_(new test::StreamGenerator(1e6, // Capacity.
159 clock_.TimeInMicroseconds())),
160 arrival_time_offset_ms_(0),
161 first_update_(true) {}
162
~DelayBasedBweTest()163 DelayBasedBweTest::~DelayBasedBweTest() {}
164
AddDefaultStream()165 void DelayBasedBweTest::AddDefaultStream() {
166 stream_generator_->AddStream(new test::RtpStream(30, 3e5));
167 }
168
169 const uint32_t DelayBasedBweTest::kDefaultSsrc = 0;
170
IncomingFeedback(int64_t arrival_time_ms,int64_t send_time_ms,size_t payload_size)171 void DelayBasedBweTest::IncomingFeedback(int64_t arrival_time_ms,
172 int64_t send_time_ms,
173 size_t payload_size) {
174 IncomingFeedback(arrival_time_ms, send_time_ms, payload_size,
175 PacedPacketInfo());
176 }
177
IncomingFeedback(int64_t arrival_time_ms,int64_t send_time_ms,size_t payload_size,const PacedPacketInfo & pacing_info)178 void DelayBasedBweTest::IncomingFeedback(int64_t arrival_time_ms,
179 int64_t send_time_ms,
180 size_t payload_size,
181 const PacedPacketInfo& pacing_info) {
182 RTC_CHECK_GE(arrival_time_ms + arrival_time_offset_ms_, 0);
183 IncomingFeedback(Timestamp::Millis(arrival_time_ms + arrival_time_offset_ms_),
184 Timestamp::Millis(send_time_ms), payload_size, pacing_info);
185 }
186
IncomingFeedback(Timestamp receive_time,Timestamp send_time,size_t payload_size,const PacedPacketInfo & pacing_info)187 void DelayBasedBweTest::IncomingFeedback(Timestamp receive_time,
188 Timestamp send_time,
189 size_t payload_size,
190 const PacedPacketInfo& pacing_info) {
191 PacketResult packet;
192 packet.receive_time = receive_time;
193 packet.sent_packet.send_time = send_time;
194 packet.sent_packet.size = DataSize::Bytes(payload_size);
195 packet.sent_packet.pacing_info = pacing_info;
196 if (packet.sent_packet.pacing_info.probe_cluster_id !=
197 PacedPacketInfo::kNotAProbe)
198 probe_bitrate_estimator_->HandleProbeAndEstimateBitrate(packet);
199
200 TransportPacketsFeedback msg;
201 msg.feedback_time = Timestamp::Millis(clock_.TimeInMilliseconds());
202 msg.packet_feedbacks.push_back(packet);
203 acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(
204 msg.SortedByReceiveTime());
205 DelayBasedBwe::Result result =
206 bitrate_estimator_->IncomingPacketFeedbackVector(
207 msg, acknowledged_bitrate_estimator_->bitrate(),
208 probe_bitrate_estimator_->FetchAndResetLastEstimatedBitrate(),
209 /*network_estimate*/ absl::nullopt, /*in_alr*/ false);
210 if (result.updated) {
211 bitrate_observer_.OnReceiveBitrateChanged(result.target_bitrate.bps());
212 }
213 }
214
215 // Generates a frame of packets belonging to a stream at a given bitrate and
216 // with a given ssrc. The stream is pushed through a very simple simulated
217 // network, and is then given to the receive-side bandwidth estimator.
218 // Returns true if an over-use was seen, false otherwise.
219 // The StreamGenerator::updated() should be used to check for any changes in
220 // target bitrate after the call to this function.
GenerateAndProcessFrame(uint32_t ssrc,uint32_t bitrate_bps)221 bool DelayBasedBweTest::GenerateAndProcessFrame(uint32_t ssrc,
222 uint32_t bitrate_bps) {
223 stream_generator_->SetBitrateBps(bitrate_bps);
224 std::vector<PacketResult> packets;
225
226 int64_t next_time_us =
227 stream_generator_->GenerateFrame(&packets, clock_.TimeInMicroseconds());
228 if (packets.empty())
229 return false;
230
231 bool overuse = false;
232 bitrate_observer_.Reset();
233 clock_.AdvanceTimeMicroseconds(packets.back().receive_time.us() -
234 clock_.TimeInMicroseconds());
235 for (auto& packet : packets) {
236 RTC_CHECK_GE(packet.receive_time.ms() + arrival_time_offset_ms_, 0);
237 packet.receive_time += TimeDelta::Millis(arrival_time_offset_ms_);
238
239 if (packet.sent_packet.pacing_info.probe_cluster_id !=
240 PacedPacketInfo::kNotAProbe)
241 probe_bitrate_estimator_->HandleProbeAndEstimateBitrate(packet);
242 }
243
244 acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(packets);
245 TransportPacketsFeedback msg;
246 msg.packet_feedbacks = packets;
247 msg.feedback_time = Timestamp::Millis(clock_.TimeInMilliseconds());
248
249 DelayBasedBwe::Result result =
250 bitrate_estimator_->IncomingPacketFeedbackVector(
251 msg, acknowledged_bitrate_estimator_->bitrate(),
252 probe_bitrate_estimator_->FetchAndResetLastEstimatedBitrate(),
253 /*network_estimate*/ absl::nullopt, /*in_alr*/ false);
254 if (result.updated) {
255 bitrate_observer_.OnReceiveBitrateChanged(result.target_bitrate.bps());
256 if (!first_update_ && result.target_bitrate.bps() < bitrate_bps)
257 overuse = true;
258 first_update_ = false;
259 }
260
261 clock_.AdvanceTimeMicroseconds(next_time_us - clock_.TimeInMicroseconds());
262 return overuse;
263 }
264
265 // Run the bandwidth estimator with a stream of `number_of_frames` frames, or
266 // until it reaches `target_bitrate`.
267 // Can for instance be used to run the estimator for some time to get it
268 // into a steady state.
SteadyStateRun(uint32_t ssrc,int max_number_of_frames,uint32_t start_bitrate,uint32_t min_bitrate,uint32_t max_bitrate,uint32_t target_bitrate)269 uint32_t DelayBasedBweTest::SteadyStateRun(uint32_t ssrc,
270 int max_number_of_frames,
271 uint32_t start_bitrate,
272 uint32_t min_bitrate,
273 uint32_t max_bitrate,
274 uint32_t target_bitrate) {
275 uint32_t bitrate_bps = start_bitrate;
276 bool bitrate_update_seen = false;
277 // Produce `number_of_frames` frames and give them to the estimator.
278 for (int i = 0; i < max_number_of_frames; ++i) {
279 bool overuse = GenerateAndProcessFrame(ssrc, bitrate_bps);
280 if (overuse) {
281 EXPECT_LT(bitrate_observer_.latest_bitrate(), max_bitrate);
282 EXPECT_GT(bitrate_observer_.latest_bitrate(), min_bitrate);
283 bitrate_bps = bitrate_observer_.latest_bitrate();
284 bitrate_update_seen = true;
285 } else if (bitrate_observer_.updated()) {
286 bitrate_bps = bitrate_observer_.latest_bitrate();
287 bitrate_observer_.Reset();
288 }
289 if (bitrate_update_seen && bitrate_bps > target_bitrate) {
290 break;
291 }
292 }
293 EXPECT_TRUE(bitrate_update_seen);
294 return bitrate_bps;
295 }
296
InitialBehaviorTestHelper(uint32_t expected_converge_bitrate)297 void DelayBasedBweTest::InitialBehaviorTestHelper(
298 uint32_t expected_converge_bitrate) {
299 const int kFramerate = 50; // 50 fps to avoid rounding errors.
300 const int kFrameIntervalMs = 1000 / kFramerate;
301 const PacedPacketInfo kPacingInfo(0, 5, 5000);
302 DataRate bitrate = DataRate::Zero();
303 int64_t send_time_ms = 0;
304 std::vector<uint32_t> ssrcs;
305 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate));
306 EXPECT_EQ(0u, ssrcs.size());
307 clock_.AdvanceTimeMilliseconds(1000);
308 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate));
309 EXPECT_FALSE(bitrate_observer_.updated());
310 bitrate_observer_.Reset();
311 clock_.AdvanceTimeMilliseconds(1000);
312 // Inserting packets for 5 seconds to get a valid estimate.
313 for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) {
314 // NOTE!!! If the following line is moved under the if case then this test
315 // wont work on windows realease bots.
316 PacedPacketInfo pacing_info =
317 i < kInitialProbingPackets ? kPacingInfo : PacedPacketInfo();
318
319 if (i == kNumInitialPackets) {
320 EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate));
321 EXPECT_EQ(0u, ssrcs.size());
322 EXPECT_FALSE(bitrate_observer_.updated());
323 bitrate_observer_.Reset();
324 }
325 IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, kMtu,
326 pacing_info);
327 clock_.AdvanceTimeMilliseconds(1000 / kFramerate);
328 send_time_ms += kFrameIntervalMs;
329 }
330 EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate));
331 ASSERT_EQ(1u, ssrcs.size());
332 EXPECT_EQ(kDefaultSsrc, ssrcs.front());
333 EXPECT_NEAR(expected_converge_bitrate, bitrate.bps(),
334 kAcceptedBitrateErrorBps);
335 EXPECT_TRUE(bitrate_observer_.updated());
336 bitrate_observer_.Reset();
337 EXPECT_EQ(bitrate_observer_.latest_bitrate(), bitrate.bps());
338 }
339
RateIncreaseReorderingTestHelper(uint32_t expected_bitrate_bps)340 void DelayBasedBweTest::RateIncreaseReorderingTestHelper(
341 uint32_t expected_bitrate_bps) {
342 const int kFramerate = 50; // 50 fps to avoid rounding errors.
343 const int kFrameIntervalMs = 1000 / kFramerate;
344 const PacedPacketInfo kPacingInfo(0, 5, 5000);
345 int64_t send_time_ms = 0;
346 // Inserting packets for five seconds to get a valid estimate.
347 for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) {
348 // NOTE!!! If the following line is moved under the if case then this test
349 // wont work on windows realease bots.
350 PacedPacketInfo pacing_info =
351 i < kInitialProbingPackets ? kPacingInfo : PacedPacketInfo();
352
353 // TODO(sprang): Remove this hack once the single stream estimator is gone,
354 // as it doesn't do anything in Process().
355 if (i == kNumInitialPackets) {
356 // Process after we have enough frames to get a valid input rate estimate.
357
358 EXPECT_FALSE(bitrate_observer_.updated()); // No valid estimate.
359 }
360 IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, kMtu,
361 pacing_info);
362 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
363 send_time_ms += kFrameIntervalMs;
364 }
365 EXPECT_TRUE(bitrate_observer_.updated());
366 EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_.latest_bitrate(),
367 kAcceptedBitrateErrorBps);
368 for (int i = 0; i < 10; ++i) {
369 clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
370 send_time_ms += 2 * kFrameIntervalMs;
371 IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
372 IncomingFeedback(clock_.TimeInMilliseconds(),
373 send_time_ms - kFrameIntervalMs, 1000);
374 }
375 EXPECT_TRUE(bitrate_observer_.updated());
376 EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_.latest_bitrate(),
377 kAcceptedBitrateErrorBps);
378 }
379
380 // Make sure we initially increase the bitrate as expected.
RateIncreaseRtpTimestampsTestHelper(int expected_iterations)381 void DelayBasedBweTest::RateIncreaseRtpTimestampsTestHelper(
382 int expected_iterations) {
383 // This threshold corresponds approximately to increasing linearly with
384 // bitrate(i) = 1.04 * bitrate(i-1) + 1000
385 // until bitrate(i) > 500000, with bitrate(1) ~= 30000.
386 uint32_t bitrate_bps = 30000;
387 int iterations = 0;
388 AddDefaultStream();
389 // Feed the estimator with a stream of packets and verify that it reaches
390 // 500 kbps at the expected time.
391 while (bitrate_bps < 5e5) {
392 bool overuse = GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps);
393 if (overuse) {
394 EXPECT_GT(bitrate_observer_.latest_bitrate(), bitrate_bps);
395 bitrate_bps = bitrate_observer_.latest_bitrate();
396 bitrate_observer_.Reset();
397 } else if (bitrate_observer_.updated()) {
398 bitrate_bps = bitrate_observer_.latest_bitrate();
399 bitrate_observer_.Reset();
400 }
401 ++iterations;
402 }
403 ASSERT_EQ(expected_iterations, iterations);
404 }
405
CapacityDropTestHelper(int number_of_streams,bool wrap_time_stamp,uint32_t expected_bitrate_drop_delta,int64_t receiver_clock_offset_change_ms)406 void DelayBasedBweTest::CapacityDropTestHelper(
407 int number_of_streams,
408 bool wrap_time_stamp,
409 uint32_t expected_bitrate_drop_delta,
410 int64_t receiver_clock_offset_change_ms) {
411 const int kFramerate = 30;
412 const int kStartBitrate = 900e3;
413 const int kMinExpectedBitrate = 800e3;
414 const int kMaxExpectedBitrate = 1100e3;
415 const uint32_t kInitialCapacityBps = 1000e3;
416 const uint32_t kReducedCapacityBps = 500e3;
417
418 int steady_state_time = 0;
419 if (number_of_streams <= 1) {
420 steady_state_time = 10;
421 AddDefaultStream();
422 } else {
423 steady_state_time = 10 * number_of_streams;
424 int bitrate_sum = 0;
425 int kBitrateDenom = number_of_streams * (number_of_streams - 1);
426 for (int i = 0; i < number_of_streams; i++) {
427 // First stream gets half available bitrate, while the rest share the
428 // remaining half i.e.: 1/2 = Sum[n/(N*(N-1))] for n=1..N-1 (rounded up)
429 int bitrate = kStartBitrate / 2;
430 if (i > 0) {
431 bitrate = (kStartBitrate * i + kBitrateDenom / 2) / kBitrateDenom;
432 }
433 stream_generator_->AddStream(new test::RtpStream(kFramerate, bitrate));
434 bitrate_sum += bitrate;
435 }
436 ASSERT_EQ(bitrate_sum, kStartBitrate);
437 }
438
439 // Run in steady state to make the estimator converge.
440 stream_generator_->set_capacity_bps(kInitialCapacityBps);
441 uint32_t bitrate_bps = SteadyStateRun(
442 kDefaultSsrc, steady_state_time * kFramerate, kStartBitrate,
443 kMinExpectedBitrate, kMaxExpectedBitrate, kInitialCapacityBps);
444 EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 180000u);
445 bitrate_observer_.Reset();
446
447 // Add an offset to make sure the BWE can handle it.
448 arrival_time_offset_ms_ += receiver_clock_offset_change_ms;
449
450 // Reduce the capacity and verify the decrease time.
451 stream_generator_->set_capacity_bps(kReducedCapacityBps);
452 int64_t overuse_start_time = clock_.TimeInMilliseconds();
453 int64_t bitrate_drop_time = -1;
454 for (int i = 0; i < 100 * number_of_streams; ++i) {
455 GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps);
456 if (bitrate_drop_time == -1 &&
457 bitrate_observer_.latest_bitrate() <= kReducedCapacityBps) {
458 bitrate_drop_time = clock_.TimeInMilliseconds();
459 }
460 if (bitrate_observer_.updated())
461 bitrate_bps = bitrate_observer_.latest_bitrate();
462 }
463
464 EXPECT_NEAR(expected_bitrate_drop_delta,
465 bitrate_drop_time - overuse_start_time, 33);
466 }
467
TestTimestampGroupingTestHelper()468 void DelayBasedBweTest::TestTimestampGroupingTestHelper() {
469 const int kFramerate = 50; // 50 fps to avoid rounding errors.
470 const int kFrameIntervalMs = 1000 / kFramerate;
471 int64_t send_time_ms = 0;
472 // Initial set of frames to increase the bitrate. 6 seconds to have enough
473 // time for the first estimate to be generated and for Process() to be called.
474 for (int i = 0; i <= 6 * kFramerate; ++i) {
475 IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
476
477 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
478 send_time_ms += kFrameIntervalMs;
479 }
480 EXPECT_TRUE(bitrate_observer_.updated());
481 EXPECT_GE(bitrate_observer_.latest_bitrate(), 400000u);
482
483 // Insert batches of frames which were sent very close in time. Also simulate
484 // capacity over-use to see that we back off correctly.
485 const int kTimestampGroupLength = 15;
486 for (int i = 0; i < 100; ++i) {
487 for (int j = 0; j < kTimestampGroupLength; ++j) {
488 // Insert `kTimestampGroupLength` frames with just 1 timestamp ticks in
489 // between. Should be treated as part of the same group by the estimator.
490 IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 100);
491 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength);
492 send_time_ms += 1;
493 }
494 // Increase time until next batch to simulate over-use.
495 clock_.AdvanceTimeMilliseconds(10);
496 send_time_ms += kFrameIntervalMs - kTimestampGroupLength;
497 }
498 EXPECT_TRUE(bitrate_observer_.updated());
499 // Should have reduced the estimate.
500 EXPECT_LT(bitrate_observer_.latest_bitrate(), 400000u);
501 }
502
TestWrappingHelper(int silence_time_s)503 void DelayBasedBweTest::TestWrappingHelper(int silence_time_s) {
504 const int kFramerate = 100;
505 const int kFrameIntervalMs = 1000 / kFramerate;
506 int64_t send_time_ms = 0;
507
508 for (size_t i = 0; i < 3000; ++i) {
509 IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
510 clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
511 send_time_ms += kFrameIntervalMs;
512 }
513 DataRate bitrate_before = DataRate::Zero();
514 std::vector<uint32_t> ssrcs;
515 bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_before);
516
517 clock_.AdvanceTimeMilliseconds(silence_time_s * 1000);
518 send_time_ms += silence_time_s * 1000;
519
520 for (size_t i = 0; i < 24; ++i) {
521 IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
522 clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
523 send_time_ms += kFrameIntervalMs;
524 }
525 DataRate bitrate_after = DataRate::Zero();
526 bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_after);
527 EXPECT_LT(bitrate_after, bitrate_before);
528 }
529 } // namespace webrtc
530