Index: webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc b/webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.cc |
similarity index 50% |
copy from webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc |
copy to webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.cc |
index f9588096a070226e1d4cc18e9e68bc07c9d1d5f8..072753113cca733902c989b0c2fc816fcf209ce1 100644 |
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc |
+++ b/webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.cc |
@@ -1,5 +1,5 @@ |
/* |
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
+ * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
* |
* Use of this source code is governed by a BSD-style license |
* that can be found in the LICENSE file in the root of the source |
@@ -7,12 +7,14 @@ |
* in the file PATENTS. All contributing project authors may |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h" |
+#include "webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.h" |
#include <algorithm> |
#include <limits> |
#include <utility> |
+#include "webrtc/modules/congestion_controller/delay_based_bwe.h" |
philipel
2016/07/06 13:36:36
Maybe move before system includes? Not sure...
stefan-webrtc
2016/07/06 14:53:24
No, should be after according to style guides.
philipel
2016/07/07 08:11:38
Acknowledged.
|
+ |
namespace webrtc { |
const size_t kMtu = 1200; |
@@ -21,7 +23,7 @@ const uint32_t kAcceptedBitrateErrorBps = 50000; |
// Number of packets needed before we have a valid estimate. |
const int kNumInitialPackets = 2; |
-namespace testing { |
+namespace test { |
void TestBitrateObserver::OnReceiveBitrateChanged( |
const std::vector<uint32_t>& ssrcs, |
@@ -30,31 +32,19 @@ void TestBitrateObserver::OnReceiveBitrateChanged( |
updated_ = true; |
} |
-RtpStream::RtpStream(int fps, |
- int bitrate_bps, |
- uint32_t ssrc, |
- uint32_t frequency, |
- uint32_t timestamp_offset, |
- int64_t rtcp_receive_time) |
+RtpStream::RtpStream(int fps, int bitrate_bps) |
: fps_(fps), |
bitrate_bps_(bitrate_bps), |
- ssrc_(ssrc), |
- frequency_(frequency), |
next_rtp_time_(0), |
- next_rtcp_time_(rtcp_receive_time), |
- rtp_timestamp_offset_(timestamp_offset), |
- kNtpFracPerMs(4.294967296E6) { |
+ sequence_number_(0) { |
assert(fps_ > 0); |
philipel
2016/07/06 13:36:36
ASSERT_GT
|
} |
-void RtpStream::set_rtp_timestamp_offset(uint32_t offset) { |
- rtp_timestamp_offset_ = offset; |
-} |
- |
// Generates a new frame for this stream. If called too soon after the |
// previous frame, no frame will be generated. The frame is split into |
// packets. |
-int64_t RtpStream::GenerateFrame(int64_t time_now_us, PacketList* packets) { |
+int64_t RtpStream::GenerateFrame(int64_t time_now_us, |
+ std::vector<PacketInfo>* packets) { |
if (time_now_us < next_rtp_time_) { |
return next_rtp_time_; |
} |
@@ -62,14 +52,13 @@ int64_t RtpStream::GenerateFrame(int64_t time_now_us, PacketList* packets) { |
size_t bits_per_frame = (bitrate_bps_ + fps_ / 2) / fps_; |
size_t n_packets = |
std::max<size_t>((bits_per_frame + 4 * kMtu) / (8 * kMtu), 1u); |
- size_t packet_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets); |
+ size_t payload_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets); |
for (size_t i = 0; i < n_packets; ++i) { |
- RtpPacket* packet = new RtpPacket; |
- packet->send_time = time_now_us + kSendSideOffsetUs; |
- packet->size = packet_size; |
- packet->rtp_timestamp = rtp_timestamp_offset_ + static_cast<uint32_t>( |
- ((frequency_ / 1000) * packet->send_time + 500) / 1000); |
- packet->ssrc = ssrc_; |
+ PacketInfo packet(-1, -1); |
+ packet.send_time_ms = (time_now_us + kSendSideOffsetUs) / 1000; |
+ packet.payload_size = payload_size; |
+ packet.sequence_number = sequence_number_++; |
+ packet.probe_cluster_id = PacketInfo::kNotAProbe; |
packets->push_back(packet); |
} |
next_rtp_time_ = time_now_us + (1000000 + fps_ / 2) / fps_; |
@@ -81,23 +70,6 @@ double RtpStream::next_rtp_time() const { |
return next_rtp_time_; |
} |
-// Generates an RTCP packet. |
-RtpStream::RtcpPacket* RtpStream::Rtcp(int64_t time_now_us) { |
- if (time_now_us < next_rtcp_time_) { |
- return NULL; |
- } |
- RtcpPacket* rtcp = new RtcpPacket; |
- int64_t send_time_us = time_now_us + kSendSideOffsetUs; |
- rtcp->timestamp = rtp_timestamp_offset_ + static_cast<uint32_t>( |
- ((frequency_ / 1000) * send_time_us + 500) / 1000); |
- rtcp->ntp_secs = send_time_us / 1000000; |
- rtcp->ntp_frac = static_cast<int64_t>((send_time_us % 1000000) * |
- kNtpFracPerMs); |
- rtcp->ssrc = ssrc_; |
- next_rtcp_time_ = time_now_us + kRtcpIntervalUs; |
- return rtcp; |
-} |
- |
void RtpStream::set_bitrate_bps(int bitrate_bps) { |
ASSERT_GE(bitrate_bps, 0); |
bitrate_bps_ = bitrate_bps; |
@@ -107,30 +79,19 @@ int RtpStream::bitrate_bps() const { |
return bitrate_bps_; |
} |
-uint32_t RtpStream::ssrc() const { |
- return ssrc_; |
-} |
- |
-bool RtpStream::Compare(const std::pair<uint32_t, RtpStream*>& left, |
- const std::pair<uint32_t, RtpStream*>& right) { |
- return left.second->next_rtp_time_ < right.second->next_rtp_time_; |
+bool RtpStream::Compare(const std::unique_ptr<RtpStream>& lhs, |
+ const std::unique_ptr<RtpStream>& rhs) { |
+ return lhs->next_rtp_time_ < rhs->next_rtp_time_; |
} |
StreamGenerator::StreamGenerator(int capacity, double time_now) |
- : capacity_(capacity), |
- prev_arrival_time_us_(time_now) {} |
+ : capacity_(capacity), prev_arrival_time_us_(time_now) {} |
-StreamGenerator::~StreamGenerator() { |
- for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); |
- ++it) { |
- delete it->second; |
- } |
- streams_.clear(); |
-} |
+StreamGenerator::~StreamGenerator() {} |
philipel
2016/07/06 13:36:36
Remove empty destructor
stefan-webrtc
2016/07/06 14:53:24
Done.
|
// Add a new stream. |
void StreamGenerator::AddStream(RtpStream* stream) { |
- streams_[stream->ssrc()] = stream; |
+ streams_.push_back(std::unique_ptr<RtpStream>(stream)); |
} |
// Set the link capacity. |
@@ -144,95 +105,83 @@ void StreamGenerator::set_capacity_bps(int capacity_bps) { |
void StreamGenerator::SetBitrateBps(int bitrate_bps) { |
ASSERT_GE(streams_.size(), 0u); |
int total_bitrate_before = 0; |
- for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); ++it) { |
- total_bitrate_before += it->second->bitrate_bps(); |
+ for (const auto& stream : streams_) { |
+ total_bitrate_before += stream->bitrate_bps(); |
} |
int64_t bitrate_before = 0; |
int total_bitrate_after = 0; |
- for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); ++it) { |
- bitrate_before += it->second->bitrate_bps(); |
- int64_t bitrate_after = (bitrate_before * bitrate_bps + |
- total_bitrate_before / 2) / total_bitrate_before; |
- it->second->set_bitrate_bps(bitrate_after - total_bitrate_after); |
- total_bitrate_after += it->second->bitrate_bps(); |
+ for (const auto& stream : streams_) { |
+ bitrate_before += stream->bitrate_bps(); |
+ int64_t bitrate_after = |
+ (bitrate_before * bitrate_bps + total_bitrate_before / 2) / |
+ total_bitrate_before; |
+ stream->set_bitrate_bps(bitrate_after - total_bitrate_after); |
+ total_bitrate_after += stream->bitrate_bps(); |
} |
ASSERT_EQ(bitrate_before, total_bitrate_before); |
EXPECT_EQ(total_bitrate_after, bitrate_bps); |
} |
-// Set the RTP timestamp offset for the stream identified by |ssrc|. |
-void StreamGenerator::set_rtp_timestamp_offset(uint32_t ssrc, uint32_t offset) { |
- streams_[ssrc]->set_rtp_timestamp_offset(offset); |
-} |
- |
// TODO(holmer): Break out the channel simulation part from this class to make |
// it possible to simulate different types of channels. |
-int64_t StreamGenerator::GenerateFrame(RtpStream::PacketList* packets, |
+int64_t StreamGenerator::GenerateFrame(std::vector<PacketInfo>* packets, |
int64_t time_now_us) { |
assert(packets != NULL); |
assert(packets->empty()); |
assert(capacity_ > 0); |
philipel
2016/07/06 13:36:36
ASSERT, ASSERT, ASSERT_GT
stefan-webrtc
2016/07/06 14:53:24
Same here.
|
- StreamMap::iterator it = std::min_element(streams_.begin(), streams_.end(), |
- RtpStream::Compare); |
- (*it).second->GenerateFrame(time_now_us, packets); |
+ auto it = |
+ std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare); |
+ (*it)->GenerateFrame(time_now_us, packets); |
int i = 0; |
- for (RtpStream::PacketList::iterator packet_it = packets->begin(); |
- packet_it != packets->end(); ++packet_it) { |
+ for (PacketInfo& packet : *packets) { |
int capacity_bpus = capacity_ / 1000; |
int64_t required_network_time_us = |
- (8 * 1000 * (*packet_it)->size + capacity_bpus / 2) / capacity_bpus; |
- prev_arrival_time_us_ = std::max(time_now_us + required_network_time_us, |
- prev_arrival_time_us_ + required_network_time_us); |
- (*packet_it)->arrival_time = prev_arrival_time_us_; |
+ (8 * 1000 * packet.payload_size + capacity_bpus / 2) / capacity_bpus; |
+ prev_arrival_time_us_ = |
+ std::max(time_now_us + required_network_time_us, |
+ prev_arrival_time_us_ + required_network_time_us); |
+ packet.arrival_time_ms = prev_arrival_time_us_ / 1000; |
++i; |
} |
it = std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare); |
- return (*it).second->next_rtp_time(); |
+ return (*it)->next_rtp_time(); |
} |
-} // namespace testing |
+} // namespace test |
-RemoteBitrateEstimatorTest::RemoteBitrateEstimatorTest() |
+DelayBasedBweTest::DelayBasedBweTest() |
: clock_(0), |
- bitrate_observer_(new testing::TestBitrateObserver), |
- stream_generator_(new testing::StreamGenerator( |
- 1e6, // Capacity. |
- clock_.TimeInMicroseconds())) {} |
- |
-RemoteBitrateEstimatorTest::~RemoteBitrateEstimatorTest() {} |
- |
-void RemoteBitrateEstimatorTest::AddDefaultStream() { |
- stream_generator_->AddStream(new testing::RtpStream( |
- 30, // Frames per second. |
- 3e5, // Bitrate. |
- 1, // SSRC. |
- 90000, // RTP frequency. |
- 0xFFFFF000, // Timestamp offset. |
- 0)); // RTCP receive time. |
-} |
+ bitrate_observer_(new test::TestBitrateObserver), |
+ bitrate_estimator_(new DelayBasedBwe(bitrate_observer_.get(), &clock_)), |
+ stream_generator_( |
+ new test::StreamGenerator(1e6, // Capacity. |
+ clock_.TimeInMicroseconds())) {} |
+ |
+DelayBasedBweTest::~DelayBasedBweTest() {} |
-uint32_t RemoteBitrateEstimatorTest::AbsSendTime(int64_t t, int64_t denom) { |
- return (((t << 18) + (denom >> 1)) / denom) & 0x00fffffful; |
+void DelayBasedBweTest::AddDefaultStream() { |
+ stream_generator_->AddStream(new test::RtpStream(30, 3e5)); |
} |
-uint32_t RemoteBitrateEstimatorTest::AddAbsSendTime(uint32_t t1, uint32_t t2) { |
- return (t1 + t2) & 0x00fffffful; |
+const uint32_t DelayBasedBweTest::kDefaultSsrc = 0; |
+ |
+void DelayBasedBweTest::IncomingPacket(size_t payload_size, |
+ int64_t arrival_time_ms, |
+ int64_t send_time_ms, |
+ uint16_t sequence_number) { |
+ IncomingPacket(payload_size, arrival_time_ms, send_time_ms, sequence_number, |
philipel
2016/07/06 13:36:36
Remove |sequence_number| argument and set to 0.
|
+ 0); |
} |
-const uint32_t RemoteBitrateEstimatorTest::kDefaultSsrc = 1; |
- |
-void RemoteBitrateEstimatorTest::IncomingPacket(uint32_t ssrc, |
- size_t payload_size, |
- int64_t arrival_time, |
- uint32_t rtp_timestamp, |
- uint32_t absolute_send_time) { |
- RTPHeader header; |
- memset(&header, 0, sizeof(header)); |
- header.ssrc = ssrc; |
- header.timestamp = rtp_timestamp; |
- header.extension.hasAbsoluteSendTime = true; |
- header.extension.absoluteSendTime = absolute_send_time; |
- bitrate_estimator_->IncomingPacket(arrival_time + kArrivalTimeClockOffsetMs, |
- payload_size, header); |
+void DelayBasedBweTest::IncomingPacket(size_t payload_size, |
+ int64_t arrival_time_ms, |
+ int64_t send_time_ms, |
+ uint16_t sequence_number, |
+ int probe_cluster_id) { |
+ PacketInfo packet(arrival_time_ms + arrival_time_offset_ms_, send_time_ms, |
+ sequence_number, payload_size, probe_cluster_id); |
philipel
2016/07/06 13:36:36
Remove |sequence_number| argument and set to 0.
|
+ std::vector<PacketInfo> packets; |
+ packets.push_back(packet); |
+ bitrate_estimator_->IncomingPacketFeedbackVector(packets); |
} |
// Generates a frame of packets belonging to a stream at a given bitrate and |
@@ -241,31 +190,29 @@ void RemoteBitrateEstimatorTest::IncomingPacket(uint32_t ssrc, |
// Returns true if an over-use was seen, false otherwise. |
// The StreamGenerator::updated() should be used to check for any changes in |
// target bitrate after the call to this function. |
-bool RemoteBitrateEstimatorTest::GenerateAndProcessFrame(uint32_t ssrc, |
- uint32_t bitrate_bps) { |
+bool DelayBasedBweTest::GenerateAndProcessFrame(uint32_t ssrc, |
+ uint32_t bitrate_bps) { |
stream_generator_->SetBitrateBps(bitrate_bps); |
- testing::RtpStream::PacketList packets; |
- int64_t next_time_us = stream_generator_->GenerateFrame( |
- &packets, clock_.TimeInMicroseconds()); |
+ std::vector<PacketInfo> packets; |
+ int64_t next_time_us = |
+ stream_generator_->GenerateFrame(&packets, clock_.TimeInMicroseconds()); |
+ if (packets.empty()) |
+ return false; |
+ |
bool overuse = false; |
- while (!packets.empty()) { |
- testing::RtpStream::RtpPacket* packet = packets.front(); |
- bitrate_observer_->Reset(); |
- // The simulated clock should match the time of packet->arrival_time |
- // since both are used in IncomingPacket(). |
- clock_.AdvanceTimeMicroseconds(packet->arrival_time - |
- clock_.TimeInMicroseconds()); |
- IncomingPacket(packet->ssrc, packet->size, |
- (packet->arrival_time + 500) / 1000, packet->rtp_timestamp, |
- AbsSendTime(packet->send_time, 1000000)); |
- if (bitrate_observer_->updated()) { |
- if (bitrate_observer_->latest_bitrate() < bitrate_bps) |
- overuse = true; |
- } |
- delete packet; |
- packets.pop_front(); |
+ bitrate_observer_->Reset(); |
+ clock_.AdvanceTimeMicroseconds(1000 * packets.back().arrival_time_ms - |
+ clock_.TimeInMicroseconds()); |
+ for (auto& packet : packets) { |
+ packet.arrival_time_ms += arrival_time_offset_ms_; |
} |
- bitrate_estimator_->Process(); |
+ bitrate_estimator_->IncomingPacketFeedbackVector(packets); |
+ |
+ if (bitrate_observer_->updated()) { |
+ if (bitrate_observer_->latest_bitrate() < bitrate_bps) |
+ overuse = true; |
+ } |
+ |
clock_.AdvanceTimeMicroseconds(next_time_us - clock_.TimeInMicroseconds()); |
return overuse; |
} |
@@ -274,12 +221,12 @@ bool RemoteBitrateEstimatorTest::GenerateAndProcessFrame(uint32_t ssrc, |
// until it reaches |target_bitrate|. |
// Can for instance be used to run the estimator for some time to get it |
// into a steady state. |
-uint32_t RemoteBitrateEstimatorTest::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) { |
+uint32_t DelayBasedBweTest::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) { |
uint32_t bitrate_bps = start_bitrate; |
bool bitrate_update_seen = false; |
// Produce |number_of_frames| frames and give them to the estimator. |
@@ -302,14 +249,13 @@ uint32_t RemoteBitrateEstimatorTest::SteadyStateRun(uint32_t ssrc, |
return bitrate_bps; |
} |
-void RemoteBitrateEstimatorTest::InitialBehaviorTestHelper( |
+void DelayBasedBweTest::InitialBehaviorTestHelper( |
uint32_t expected_converge_bitrate) { |
const int kFramerate = 50; // 50 fps to avoid rounding errors. |
const int kFrameIntervalMs = 1000 / kFramerate; |
- const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); |
uint32_t bitrate_bps = 0; |
- uint32_t timestamp = 0; |
- uint32_t absolute_send_time = 0; |
+ int64_t send_time_ms = 0; |
+ uint16_t sequence_number = 0; |
std::vector<uint32_t> ssrcs; |
EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); |
EXPECT_EQ(0u, ssrcs.size()); |
@@ -329,12 +275,10 @@ void RemoteBitrateEstimatorTest::InitialBehaviorTestHelper( |
bitrate_observer_->Reset(); |
} |
- IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp, |
- absolute_send_time); |
+ IncomingPacket(kMtu, clock_.TimeInMilliseconds(), send_time_ms, |
+ sequence_number++); |
clock_.AdvanceTimeMilliseconds(1000 / kFramerate); |
- timestamp += 90 * kFrameIntervalMs; |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- kFrameIntervalAbsSendTime); |
+ send_time_ms += kFrameIntervalMs; |
} |
bitrate_estimator_->Process(); |
EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps)); |
@@ -350,13 +294,12 @@ void RemoteBitrateEstimatorTest::InitialBehaviorTestHelper( |
EXPECT_EQ(0u, bitrate_bps); |
} |
-void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper( |
+void DelayBasedBweTest::RateIncreaseReorderingTestHelper( |
uint32_t expected_bitrate_bps) { |
const int kFramerate = 50; // 50 fps to avoid rounding errors. |
const int kFrameIntervalMs = 1000 / kFramerate; |
- const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); |
- uint32_t timestamp = 0; |
- uint32_t absolute_send_time = 0; |
+ int64_t send_time_ms = 0; |
+ uint16_t sequence_number = 0; |
// Inserting packets for five seconds to get a valid estimate. |
for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) { |
// TODO(sprang): Remove this hack once the single stream estimator is gone, |
@@ -367,40 +310,32 @@ void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper( |
EXPECT_FALSE(bitrate_observer_->updated()); // No valid estimate. |
} |
- IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp, |
- absolute_send_time); |
+ IncomingPacket(kMtu, clock_.TimeInMilliseconds(), send_time_ms, |
+ sequence_number++); |
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); |
- timestamp += 90 * kFrameIntervalMs; |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- kFrameIntervalAbsSendTime); |
+ send_time_ms += kFrameIntervalMs; |
} |
bitrate_estimator_->Process(); |
EXPECT_TRUE(bitrate_observer_->updated()); |
- EXPECT_NEAR(expected_bitrate_bps, |
- bitrate_observer_->latest_bitrate(), |
+ EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_->latest_bitrate(), |
kAcceptedBitrateErrorBps); |
for (int i = 0; i < 10; ++i) { |
clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs); |
- timestamp += 2 * 90 * kFrameIntervalMs; |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- 2 * kFrameIntervalAbsSendTime); |
- IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, |
- absolute_send_time); |
- IncomingPacket( |
- kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), |
- timestamp - 90 * kFrameIntervalMs, |
- AddAbsSendTime(absolute_send_time, |
- -static_cast<int>(kFrameIntervalAbsSendTime))); |
+ send_time_ms += 2 * kFrameIntervalMs; |
+ IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
+ sequence_number + 2); |
+ IncomingPacket(1000, clock_.TimeInMilliseconds(), |
+ send_time_ms - kFrameIntervalMs, sequence_number + 1); |
+ sequence_number += 2; |
} |
bitrate_estimator_->Process(); |
EXPECT_TRUE(bitrate_observer_->updated()); |
- EXPECT_NEAR(expected_bitrate_bps, |
- bitrate_observer_->latest_bitrate(), |
+ EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_->latest_bitrate(), |
kAcceptedBitrateErrorBps); |
} |
// Make sure we initially increase the bitrate as expected. |
-void RemoteBitrateEstimatorTest::RateIncreaseRtpTimestampsTestHelper( |
+void DelayBasedBweTest::RateIncreaseRtpTimestampsTestHelper( |
int expected_iterations) { |
// This threshold corresponds approximately to increasing linearly with |
// bitrate(i) = 1.04 * bitrate(i-1) + 1000 |
@@ -426,10 +361,11 @@ void RemoteBitrateEstimatorTest::RateIncreaseRtpTimestampsTestHelper( |
ASSERT_EQ(expected_iterations, iterations); |
} |
-void RemoteBitrateEstimatorTest::CapacityDropTestHelper( |
+void DelayBasedBweTest::CapacityDropTestHelper( |
int number_of_streams, |
bool wrap_time_stamp, |
- uint32_t expected_bitrate_drop_delta) { |
+ uint32_t expected_bitrate_drop_delta, |
+ int64_t receiver_clock_offset_change_ms) { |
const int kFramerate = 30; |
const int kStartBitrate = 900e3; |
const int kMinExpectedBitrate = 800e3; |
@@ -452,22 +388,11 @@ void RemoteBitrateEstimatorTest::CapacityDropTestHelper( |
if (i > 0) { |
bitrate = (kStartBitrate * i + kBitrateDenom / 2) / kBitrateDenom; |
} |
- uint32_t mask = ~0ull << (32 - i); |
- stream_generator_->AddStream( |
- new testing::RtpStream(kFramerate, // Frames per second. |
- bitrate, // Bitrate. |
- kDefaultSsrc + i, // SSRC. |
- 90000, // RTP frequency. |
- 0xFFFFF000u ^ mask, // Timestamp offset. |
- 0)); // RTCP receive time. |
+ stream_generator_->AddStream(new test::RtpStream(kFramerate, bitrate)); |
bitrate_sum += bitrate; |
} |
ASSERT_EQ(bitrate_sum, kStartBitrate); |
} |
- if (wrap_time_stamp) { |
- stream_generator_->set_rtp_timestamp_offset(kDefaultSsrc, |
- std::numeric_limits<uint32_t>::max() - steady_state_time * 90000); |
- } |
// Run in steady state to make the estimator converge. |
stream_generator_->set_capacity_bps(kInitialCapacityBps); |
@@ -477,6 +402,9 @@ void RemoteBitrateEstimatorTest::CapacityDropTestHelper( |
EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 130000u); |
bitrate_observer_->Reset(); |
+ // Add an offset to make sure the BWE can handle it. |
+ arrival_time_offset_ms_ += receiver_clock_offset_change_ms; |
+ |
// Reduce the capacity and verify the decrease time. |
stream_generator_->set_capacity_bps(kReducedCapacityBps); |
int64_t overuse_start_time = clock_.TimeInMilliseconds(); |
@@ -492,43 +420,22 @@ void RemoteBitrateEstimatorTest::CapacityDropTestHelper( |
EXPECT_NEAR(expected_bitrate_drop_delta, |
bitrate_drop_time - overuse_start_time, 33); |
- |
- // Remove stream one by one. |
- uint32_t latest_bps = 0; |
- std::vector<uint32_t> ssrcs; |
- for (int i = 0; i < number_of_streams; i++) { |
- EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &latest_bps)); |
- EXPECT_EQ(number_of_streams - i, static_cast<int>(ssrcs.size())); |
- EXPECT_EQ(bitrate_bps, latest_bps); |
- for (int j = i; j < number_of_streams; j++) { |
- EXPECT_EQ(kDefaultSsrc + j, ssrcs[j - i]); |
- } |
- bitrate_estimator_->RemoveStream(kDefaultSsrc + i); |
- } |
- EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &latest_bps)); |
- EXPECT_EQ(0u, ssrcs.size()); |
- EXPECT_EQ(0u, latest_bps); |
} |
-void RemoteBitrateEstimatorTest::TestTimestampGroupingTestHelper() { |
+void DelayBasedBweTest::TestTimestampGroupingTestHelper() { |
const int kFramerate = 50; // 50 fps to avoid rounding errors. |
const int kFrameIntervalMs = 1000 / kFramerate; |
- const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); |
- uint32_t timestamp = 0; |
- // Initialize absolute_send_time (24 bits) so that it will definitely wrap |
- // during the test. |
- uint32_t absolute_send_time = AddAbsSendTime( |
- (1 << 24), -static_cast<int>(50 * kFrameIntervalAbsSendTime)); |
+ int64_t send_time_ms = 0; |
+ uint16_t sequence_number = 0; |
// Initial set of frames to increase the bitrate. 6 seconds to have enough |
// time for the first estimate to be generated and for Process() to be called. |
for (int i = 0; i <= 6 * kFramerate; ++i) { |
- IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, |
- absolute_send_time); |
+ IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
+ sequence_number++); |
+ |
bitrate_estimator_->Process(); |
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); |
- timestamp += 90 * kFrameIntervalMs; |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- kFrameIntervalAbsSendTime); |
+ send_time_ms += kFrameIntervalMs; |
} |
EXPECT_TRUE(bitrate_observer_->updated()); |
EXPECT_GE(bitrate_observer_->latest_bitrate(), 400000u); |
@@ -536,27 +443,18 @@ void RemoteBitrateEstimatorTest::TestTimestampGroupingTestHelper() { |
// Insert batches of frames which were sent very close in time. Also simulate |
// capacity over-use to see that we back off correctly. |
const int kTimestampGroupLength = 15; |
- const uint32_t kTimestampGroupLengthAbsSendTime = |
- AbsSendTime(kTimestampGroupLength, 90000); |
- const uint32_t kSingleRtpTickAbsSendTime = AbsSendTime(1, 90000); |
for (int i = 0; i < 100; ++i) { |
for (int j = 0; j < kTimestampGroupLength; ++j) { |
// Insert |kTimestampGroupLength| frames with just 1 timestamp ticks in |
// between. Should be treated as part of the same group by the estimator. |
- IncomingPacket(kDefaultSsrc, 100, clock_.TimeInMilliseconds(), timestamp, |
- absolute_send_time); |
+ IncomingPacket(100, clock_.TimeInMilliseconds(), send_time_ms, |
+ sequence_number++); |
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength); |
- timestamp += 1; |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- kSingleRtpTickAbsSendTime); |
+ send_time_ms += 1; |
} |
// Increase time until next batch to simulate over-use. |
clock_.AdvanceTimeMilliseconds(10); |
- timestamp += 90 * kFrameIntervalMs - kTimestampGroupLength; |
- absolute_send_time = AddAbsSendTime( |
- absolute_send_time, |
- AddAbsSendTime(kFrameIntervalAbsSendTime, |
- -static_cast<int>(kTimestampGroupLengthAbsSendTime))); |
+ send_time_ms += kFrameIntervalMs - kTimestampGroupLength; |
bitrate_estimator_->Process(); |
} |
EXPECT_TRUE(bitrate_observer_->updated()); |
@@ -564,21 +462,17 @@ void RemoteBitrateEstimatorTest::TestTimestampGroupingTestHelper() { |
EXPECT_LT(bitrate_observer_->latest_bitrate(), 400000u); |
} |
-void RemoteBitrateEstimatorTest::TestWrappingHelper( |
- int silence_time_s) { |
+void DelayBasedBweTest::TestWrappingHelper(int silence_time_s) { |
const int kFramerate = 100; |
const int kFrameIntervalMs = 1000 / kFramerate; |
- const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); |
- uint32_t absolute_send_time = 0; |
- uint32_t timestamp = 0; |
+ int64_t send_time_ms = 0; |
+ uint16_t sequence_number = 0; |
for (size_t i = 0; i < 3000; ++i) { |
- IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, |
- absolute_send_time); |
- timestamp += kFrameIntervalMs; |
+ IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
+ sequence_number++); |
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs); |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- kFrameIntervalAbsSendTime); |
+ send_time_ms += kFrameIntervalMs; |
bitrate_estimator_->Process(); |
} |
uint32_t bitrate_before = 0; |
@@ -586,16 +480,14 @@ void RemoteBitrateEstimatorTest::TestWrappingHelper( |
bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_before); |
clock_.AdvanceTimeMilliseconds(silence_time_s * 1000); |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- AbsSendTime(silence_time_s, 1)); |
+ send_time_ms += silence_time_s * 1000; |
bitrate_estimator_->Process(); |
+ |
for (size_t i = 0; i < 21; ++i) { |
- IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, |
- absolute_send_time); |
- timestamp += kFrameIntervalMs; |
+ IncomingPacket(1000, clock_.TimeInMilliseconds(), send_time_ms, |
+ sequence_number++); |
clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs); |
- absolute_send_time = AddAbsSendTime(absolute_send_time, |
- kFrameIntervalAbsSendTime); |
+ send_time_ms += kFrameIntervalMs; |
bitrate_estimator_->Process(); |
} |
uint32_t bitrate_after = 0; |