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