Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.cc

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

Powered by Google App Engine
This is Rietveld 408576698