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