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