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