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

Side by Side Diff: webrtc/modules/remote_bitrate_estimator/test/packet_sender.cc

Issue 1202253003: More Simulation Framework features (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Addressing trybot failures Created 5 years, 6 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) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 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 10
(...skipping 26 matching lines...) Expand all
37 ++it; 37 ++it;
38 } 38 }
39 } 39 }
40 return fb_packets; 40 return fb_packets;
41 } 41 }
42 42
43 VideoSender::VideoSender(PacketProcessorListener* listener, 43 VideoSender::VideoSender(PacketProcessorListener* listener,
44 VideoSource* source, 44 VideoSource* source,
45 BandwidthEstimatorType estimator_type) 45 BandwidthEstimatorType estimator_type)
46 : PacketSender(listener, source->flow_id()), 46 : PacketSender(listener, source->flow_id()),
47 running_(true),
47 source_(source), 48 source_(source),
48 bwe_(CreateBweSender(estimator_type, 49 bwe_(CreateBweSender(estimator_type,
49 source_->bits_per_second() / 1000, 50 source_->bits_per_second() / 1000,
50 this, 51 this,
51 &clock_)) { 52 &clock_)) {
52 modules_.push_back(bwe_.get()); 53 modules_.push_back(bwe_.get());
54 source->set_alg_name(bwe_names[estimator_type]);
53 } 55 }
54 56
55 VideoSender::~VideoSender() { 57 VideoSender::~VideoSender() {
56 } 58 }
57 59
58 void VideoSender::RunFor(int64_t time_ms, Packets* in_out) { 60 void VideoSender::RunFor(int64_t time_ms, Packets* in_out) {
59 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets( 61 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets(
60 in_out, clock_.TimeInMilliseconds() + time_ms, source_->flow_id()); 62 in_out, clock_.TimeInMilliseconds() + time_ms, source_->flow_id());
61 ProcessFeedbackAndGeneratePackets(time_ms, &feedbacks, in_out); 63 ProcessFeedbackAndGeneratePackets(time_ms, &feedbacks, in_out);
62 } 64 }
63 65
64 void VideoSender::ProcessFeedbackAndGeneratePackets( 66 void VideoSender::ProcessFeedbackAndGeneratePackets(
65 int64_t time_ms, 67 int64_t time_ms,
66 std::list<FeedbackPacket*>* feedbacks, 68 std::list<FeedbackPacket*>* feedbacks,
67 Packets* packets) { 69 Packets* packets) {
68 do { 70 do {
69 // Make sure to at least run Process() below every 100 ms. 71 // Make sure to at least run Process() below every 100 ms.
70 int64_t time_to_run_ms = std::min<int64_t>(time_ms, 100); 72 int64_t time_to_run_ms = std::min<int64_t>(time_ms, 100);
71 if (!feedbacks->empty()) { 73 if (!feedbacks->empty()) {
72 int64_t time_until_feedback_ms = 74 int64_t time_until_feedback_ms =
73 feedbacks->front()->send_time_us() / 1000 - 75 feedbacks->front()->send_time_us() / 1000 -
74 clock_.TimeInMilliseconds(); 76 clock_.TimeInMilliseconds();
75 time_to_run_ms = 77 time_to_run_ms =
76 std::max<int64_t>(std::min(time_ms, time_until_feedback_ms), 0); 78 std::max<int64_t>(std::min(time_ms, time_until_feedback_ms), 0);
77 } 79 }
78 Packets generated; 80 Packets generated;
81
79 source_->RunFor(time_to_run_ms, &generated); 82 source_->RunFor(time_to_run_ms, &generated);
80 bwe_->OnPacketsSent(generated); 83 bwe_->OnPacketsSent(generated);
84
81 packets->merge(generated, DereferencingComparator<Packet>); 85 packets->merge(generated, DereferencingComparator<Packet>);
86
82 clock_.AdvanceTimeMilliseconds(time_to_run_ms); 87 clock_.AdvanceTimeMilliseconds(time_to_run_ms);
88
83 if (!feedbacks->empty()) { 89 if (!feedbacks->empty()) {
84 bwe_->GiveFeedback(*feedbacks->front()); 90 bwe_->GiveFeedback(*feedbacks->front());
85 delete feedbacks->front(); 91 delete feedbacks->front();
86 feedbacks->pop_front(); 92 feedbacks->pop_front();
87 } 93 }
94
88 bwe_->Process(); 95 bwe_->Process();
96
89 time_ms -= time_to_run_ms; 97 time_ms -= time_to_run_ms;
90 } while (time_ms > 0); 98 } while (time_ms > 0);
91 assert(feedbacks->empty()); 99 assert(feedbacks->empty());
92 } 100 }
93 101
94 int VideoSender::GetFeedbackIntervalMs() const { 102 int VideoSender::GetFeedbackIntervalMs() const {
95 return bwe_->GetFeedbackIntervalMs(); 103 return bwe_->GetFeedbackIntervalMs();
96 } 104 }
97 105
98 void VideoSender::OnNetworkChanged(uint32_t target_bitrate_bps, 106 void VideoSender::OnNetworkChanged(uint32_t target_bitrate_bps,
99 uint8_t fraction_lost, 107 uint8_t fraction_lost,
100 int64_t rtt) { 108 int64_t rtt) {
101 source_->SetBitrateBps(target_bitrate_bps); 109 source_->SetBitrateBps(target_bitrate_bps);
102 } 110 }
103 111
112 void VideoSender::Pause() {
113 running_ = false;
114 source_->Pause();
115 bwe_->Pause();
116 }
117
118 void VideoSender::Resume() {
119 running_ = true;
120 source_->Resume();
121 bwe_->Resume();
122 }
123
104 PacedVideoSender::PacedVideoSender(PacketProcessorListener* listener, 124 PacedVideoSender::PacedVideoSender(PacketProcessorListener* listener,
105 VideoSource* source, 125 VideoSource* source,
106 BandwidthEstimatorType estimator) 126 BandwidthEstimatorType estimator)
107 : VideoSender(listener, source, estimator), 127 : VideoSender(listener, source, estimator),
108 pacer_(&clock_, 128 pacer_(&clock_,
109 this, 129 this,
110 source->bits_per_second() / 1000, 130 source->bits_per_second() / 1000,
111 PacedSender::kDefaultPaceMultiplier * source->bits_per_second() / 131 PacedSender::kDefaultPaceMultiplier * source->bits_per_second() /
112 1000, 132 1000,
113 0) { 133 0) {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 275
256 void PacedVideoSender::OnNetworkChanged(uint32_t target_bitrate_bps, 276 void PacedVideoSender::OnNetworkChanged(uint32_t target_bitrate_bps,
257 uint8_t fraction_lost, 277 uint8_t fraction_lost,
258 int64_t rtt) { 278 int64_t rtt) {
259 VideoSender::OnNetworkChanged(target_bitrate_bps, fraction_lost, rtt); 279 VideoSender::OnNetworkChanged(target_bitrate_bps, fraction_lost, rtt);
260 pacer_.UpdateBitrate( 280 pacer_.UpdateBitrate(
261 target_bitrate_bps / 1000, 281 target_bitrate_bps / 1000,
262 PacedSender::kDefaultPaceMultiplier * target_bitrate_bps / 1000, 0); 282 PacedSender::kDefaultPaceMultiplier * target_bitrate_bps / 1000, 0);
263 } 283 }
264 284
285 const int kNoLimit = std::numeric_limits<int>::max();
286 const int kPacketSizeBytes = 1200;
287
288 TcpSender::TcpSender(PacketProcessorListener* listener,
289 int flow_id,
290 int64_t offset_ms)
291 : PacketSender(listener, flow_id),
292 cwnd_(10),
293 ssthresh_(kNoLimit),
294 ack_received_(false),
295 last_acked_seq_num_(0),
296 next_sequence_number_(0),
297 offset_ms_(offset_ms),
298 last_reduction_time_ms_(-1),
299 last_rtt_ms_(0),
300 total_sent_bytes_(0),
301 send_limit_bytes_(kNoLimit),
302 running_(true),
303 last_generated_packets_ms_(0),
304 estimated_kbps_(0),
stefan-webrtc 2015/06/25 14:44:05 bitrate_kbps_?
magalhaesc 2015/07/01 12:48:41 Done.
305 num_recent_sent_packets_(0) {
306 }
307
308 TcpSender::TcpSender(PacketProcessorListener* listener,
309 int flow_id,
310 int64_t offset_ms,
311 int send_limit_bytes)
312 : TcpSender(listener, flow_id, offset_ms) {
313 send_limit_bytes_ = send_limit_bytes;
314 }
315
316 void TcpSender::set_choke_filter(ChokeFilter* choke_filter) {
317 choke_filter_ = choke_filter;
318 }
319
265 void TcpSender::RunFor(int64_t time_ms, Packets* in_out) { 320 void TcpSender::RunFor(int64_t time_ms, Packets* in_out) {
266 if (clock_.TimeInMilliseconds() + time_ms < offset_ms_) { 321 if (clock_.TimeInMilliseconds() + time_ms < offset_ms_) {
267 clock_.AdvanceTimeMilliseconds(time_ms); 322 clock_.AdvanceTimeMilliseconds(time_ms);
323 if (running_) {
324 choke_filter_->PauseFlow(*flow_ids().begin());
325 running_ = false;
326 }
268 return; 327 return;
269 } 328 }
329
330 if (!running_) {
331 choke_filter_->ResumeFlow(*flow_ids().begin());
332 running_ = true;
333 }
334
270 int64_t start_time_ms = clock_.TimeInMilliseconds(); 335 int64_t start_time_ms = clock_.TimeInMilliseconds();
271 BWE_TEST_LOGGING_CONTEXT("Sender"); 336 BWE_TEST_LOGGING_CONTEXT("Sender");
272 BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin()); 337 BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin());
273 338
274 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets( 339 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets(
275 in_out, clock_.TimeInMilliseconds() + time_ms, *flow_ids().begin()); 340 in_out, clock_.TimeInMilliseconds() + time_ms, *flow_ids().begin());
276 // The number of packets which are sent in during time_ms depends on the 341 // The number of packets which are sent in during time_ms depends on the
277 // number of packets in_flight_ and the max number of packets in flight 342 // number of packets in_flight_ and the max number of packets in flight
278 // (cwnd_). Therefore SendPackets() isn't directly dependent on time_ms. 343 // (cwnd_). Therefore SendPackets() isn't directly dependent on time_ms.
279 for (FeedbackPacket* fb : feedbacks) { 344 for (FeedbackPacket* fb : feedbacks) {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 void TcpSender::HandleLoss() { 417 void TcpSender::HandleLoss() {
353 if (clock_.TimeInMilliseconds() - last_reduction_time_ms_ < last_rtt_ms_) 418 if (clock_.TimeInMilliseconds() - last_reduction_time_ms_ < last_rtt_ms_)
354 return; 419 return;
355 last_reduction_time_ms_ = clock_.TimeInMilliseconds(); 420 last_reduction_time_ms_ = clock_.TimeInMilliseconds();
356 ssthresh_ = std::max(static_cast<int>(in_flight_.size() / 2), 2); 421 ssthresh_ = std::max(static_cast<int>(in_flight_.size() / 2), 2);
357 cwnd_ = ssthresh_; 422 cwnd_ = ssthresh_;
358 } 423 }
359 424
360 Packets TcpSender::GeneratePackets(size_t num_packets) { 425 Packets TcpSender::GeneratePackets(size_t num_packets) {
361 Packets generated; 426 Packets generated;
427
428 num_recent_sent_packets_ += num_packets;
429
430 // Used to update estimated bitrate.
431 const int kTimeWindowMs = 500;
432
433 int64_t delta_ms = clock_.TimeInMilliseconds() - last_generated_packets_ms_;
434 if (delta_ms >= kTimeWindowMs) {
435 estimated_kbps_ =
436 static_cast<uint32_t>(8 * num_recent_sent_packets_ * kPacketSizeBytes) /
437 delta_ms;
438 last_generated_packets_ms_ = clock_.TimeInMilliseconds();
439 num_recent_sent_packets_ = 0;
440 }
stefan-webrtc 2015/06/25 14:44:05 Can we break this out to a method UpdateSendBitrat
magalhaesc 2015/07/01 12:48:41 Sure
441
362 for (size_t i = 0; i < num_packets; ++i) { 442 for (size_t i = 0; i < num_packets; ++i) {
363 generated.push_back(new MediaPacket(*flow_ids().begin(), 443 if ((total_sent_bytes_ + kPacketSizeBytes) > send_limit_bytes_) {
364 1000 * clock_.TimeInMilliseconds(), 444 if (running_) {
365 1200, next_sequence_number_++)); 445 choke_filter_->PauseFlow(*flow_ids().begin());
446 running_ = false;
447 }
448 break;
449 }
450 generated.push_back(
451 new MediaPacket(*flow_ids().begin(), 1000 * clock_.TimeInMilliseconds(),
452 kPacketSizeBytes, next_sequence_number_++));
366 generated.back()->set_sender_timestamp_us( 453 generated.back()->set_sender_timestamp_us(
367 1000 * clock_.TimeInMilliseconds()); 454 1000 * clock_.TimeInMilliseconds());
455
456 generated.back()->set_sending_estimate_kbps(estimated_kbps_);
457 total_sent_bytes_ += kPacketSizeBytes;
368 } 458 }
459
369 return generated; 460 return generated;
370 } 461 }
371 } // namespace bwe 462 } // namespace bwe
372 } // namespace testing 463 } // namespace testing
373 } // namespace webrtc 464 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698