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

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

Issue 1270543002: Supporting Pause/Resume, Sending Estimate logging. Corrected plot colors (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Removed PacketSender member from MetricRecorder Created 5 years, 4 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
11 #include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h" 11 #include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
12 12
13 #include <algorithm> 13 #include <algorithm>
14 #include <list> 14 #include <list>
15 #include <sstream> 15 #include <sstream>
16 16
17 #include "webrtc/base/checks.h" 17 #include "webrtc/base/checks.h"
18 #include "webrtc/modules/interface/module_common_types.h" 18 #include "webrtc/modules/interface/module_common_types.h"
19 #include "webrtc/modules/remote_bitrate_estimator/test/bwe.h" 19 #include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
20 #include "webrtc/modules/remote_bitrate_estimator/test/metric_recorder.h"
20 21
21 namespace webrtc { 22 namespace webrtc {
22 namespace testing { 23 namespace testing {
23 namespace bwe { 24 namespace bwe {
24 25
26 void PacketSender::Pause() {
27 running_ = false;
28 if (metric_recorder_ != nullptr) {
29 metric_recorder_->PauseFlow();
30 }
31 }
32
33 void PacketSender::Resume(int64_t paused_time_ms) {
34 running_ = true;
35 if (metric_recorder_ != nullptr) {
36 metric_recorder_->ResumeFlow(paused_time_ms);
37 }
38 }
39
40 void PacketSender::set_metric_recorder(MetricRecorder* metric_recorder) {
41 metric_recorder_ = metric_recorder;
42 }
43
44 void PacketSender::RecordBitrate() {
45 if (metric_recorder_ != nullptr) {
46 BWE_TEST_LOGGING_CONTEXT("Sender");
47 BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin());
48 metric_recorder_->UpdateTimeMs(clock_.TimeInMilliseconds());
49 metric_recorder_->UpdateSendingEstimateKbps(TargetBitrateKbps());
50 }
51 }
52
25 std::list<FeedbackPacket*> GetFeedbackPackets(Packets* in_out, 53 std::list<FeedbackPacket*> GetFeedbackPackets(Packets* in_out,
26 int64_t end_time_ms, 54 int64_t end_time_ms,
27 int flow_id) { 55 int flow_id) {
28 std::list<FeedbackPacket*> fb_packets; 56 std::list<FeedbackPacket*> fb_packets;
29 for (auto it = in_out->begin(); it != in_out->end();) { 57 for (auto it = in_out->begin(); it != in_out->end();) {
30 if ((*it)->send_time_us() > 1000 * end_time_ms) 58 if ((*it)->send_time_us() > 1000 * end_time_ms)
31 break; 59 break;
32 if ((*it)->GetPacketType() == Packet::kFeedback && 60 if ((*it)->GetPacketType() == Packet::kFeedback &&
33 flow_id == (*it)->flow_id()) { 61 flow_id == (*it)->flow_id()) {
34 fb_packets.push_back(static_cast<FeedbackPacket*>(*it)); 62 fb_packets.push_back(static_cast<FeedbackPacket*>(*it));
35 it = in_out->erase(it); 63 it = in_out->erase(it);
36 } else { 64 } else {
37 ++it; 65 ++it;
38 } 66 }
39 } 67 }
40 return fb_packets; 68 return fb_packets;
41 } 69 }
42 70
43 VideoSender::VideoSender(PacketProcessorListener* listener, 71 VideoSender::VideoSender(PacketProcessorListener* listener,
44 VideoSource* source, 72 VideoSource* source,
45 BandwidthEstimatorType estimator_type) 73 BandwidthEstimatorType estimator_type)
46 : PacketSender(listener, source->flow_id()), 74 : PacketSender(listener, source->flow_id()),
47 running_(true),
48 source_(source), 75 source_(source),
49 bwe_(CreateBweSender(estimator_type, 76 bwe_(CreateBweSender(estimator_type,
50 source_->bits_per_second() / 1000, 77 source_->bits_per_second() / 1000,
51 this, 78 this,
52 &clock_)), 79 &clock_)),
53 previous_sending_bitrate_(0) { 80 previous_sending_bitrate_(0) {
54 modules_.push_back(bwe_.get()); 81 modules_.push_back(bwe_.get());
55 } 82 }
56 83
57 VideoSender::~VideoSender() { 84 VideoSender::~VideoSender() {
58 } 85 }
59 86
87 void VideoSender::Pause() {
88 previous_sending_bitrate_ = TargetBitrateKbps();
89 PacketSender::Pause();
90 }
91
92 void VideoSender::Resume(int64_t paused_time_ms) {
93 source_->SetBitrateBps(previous_sending_bitrate_);
94 PacketSender::Resume(paused_time_ms);
95 }
96
60 void VideoSender::RunFor(int64_t time_ms, Packets* in_out) { 97 void VideoSender::RunFor(int64_t time_ms, Packets* in_out) {
61 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets( 98 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets(
62 in_out, clock_.TimeInMilliseconds() + time_ms, source_->flow_id()); 99 in_out, clock_.TimeInMilliseconds() + time_ms, source_->flow_id());
63 ProcessFeedbackAndGeneratePackets(time_ms, &feedbacks, in_out); 100 ProcessFeedbackAndGeneratePackets(time_ms, &feedbacks, in_out);
64 } 101 }
65 102
66 void VideoSender::ProcessFeedbackAndGeneratePackets( 103 void VideoSender::ProcessFeedbackAndGeneratePackets(
67 int64_t time_ms, 104 int64_t time_ms,
68 std::list<FeedbackPacket*>* feedbacks, 105 std::list<FeedbackPacket*>* feedbacks,
69 Packets* packets) { 106 Packets* packets) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 } 139 }
103 140
104 int VideoSender::GetFeedbackIntervalMs() const { 141 int VideoSender::GetFeedbackIntervalMs() const {
105 return bwe_->GetFeedbackIntervalMs(); 142 return bwe_->GetFeedbackIntervalMs();
106 } 143 }
107 144
108 void VideoSender::OnNetworkChanged(uint32_t target_bitrate_bps, 145 void VideoSender::OnNetworkChanged(uint32_t target_bitrate_bps,
109 uint8_t fraction_lost, 146 uint8_t fraction_lost,
110 int64_t rtt) { 147 int64_t rtt) {
111 source_->SetBitrateBps(target_bitrate_bps); 148 source_->SetBitrateBps(target_bitrate_bps);
112 } 149 RecordBitrate();
113
114 void VideoSender::Pause() {
115 running_ = false;
116 previous_sending_bitrate_ = TargetBitrateKbps();
117 }
118
119 void VideoSender::Resume() {
120 running_ = true;
121 source_->SetBitrateBps(previous_sending_bitrate_);
122 } 150 }
123 151
124 uint32_t VideoSender::TargetBitrateKbps() { 152 uint32_t VideoSender::TargetBitrateKbps() {
125 return (source_->bits_per_second() + 500) / 1000; 153 return (source_->bits_per_second() + 500) / 1000;
126 } 154 }
127 155
128 PacedVideoSender::PacedVideoSender(PacketProcessorListener* listener, 156 PacedVideoSender::PacedVideoSender(PacketProcessorListener* listener,
129 VideoSource* source, 157 VideoSource* source,
130 BandwidthEstimatorType estimator) 158 BandwidthEstimatorType estimator)
131 : VideoSender(listener, source, estimator), 159 : VideoSender(listener, source, estimator),
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 cwnd_(10), 330 cwnd_(10),
303 ssthresh_(kNoLimit), 331 ssthresh_(kNoLimit),
304 ack_received_(false), 332 ack_received_(false),
305 last_acked_seq_num_(0), 333 last_acked_seq_num_(0),
306 next_sequence_number_(0), 334 next_sequence_number_(0),
307 offset_ms_(offset_ms), 335 offset_ms_(offset_ms),
308 last_reduction_time_ms_(-1), 336 last_reduction_time_ms_(-1),
309 last_rtt_ms_(0), 337 last_rtt_ms_(0),
310 total_sent_bytes_(0), 338 total_sent_bytes_(0),
311 send_limit_bytes_(send_limit_bytes), 339 send_limit_bytes_(send_limit_bytes),
312 running_(true),
313 last_generated_packets_ms_(0), 340 last_generated_packets_ms_(0),
314 num_recent_sent_packets_(0), 341 num_recent_sent_packets_(0),
315 bitrate_kbps_(0) { 342 bitrate_kbps_(0) {
316 } 343 }
317 344
318 void TcpSender::RunFor(int64_t time_ms, Packets* in_out) { 345 void TcpSender::RunFor(int64_t time_ms, Packets* in_out) {
319 if (clock_.TimeInMilliseconds() + time_ms < offset_ms_) { 346 if (clock_.TimeInMilliseconds() + time_ms < offset_ms_) {
320 clock_.AdvanceTimeMilliseconds(time_ms); 347 clock_.AdvanceTimeMilliseconds(time_ms);
321 if (running_) { 348 if (running_) {
322 running_ = false; 349 Pause();
323 } 350 }
324 return; 351 return;
325 } 352 }
326 353
327 if (!running_) { 354 if (!running_ && total_sent_bytes_ == 0) {
328 running_ = true; 355 Resume(offset_ms_);
329 } 356 }
330 357
331 int64_t start_time_ms = clock_.TimeInMilliseconds(); 358 int64_t start_time_ms = clock_.TimeInMilliseconds();
332 BWE_TEST_LOGGING_CONTEXT("Sender");
333 BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin());
334 359
335 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets( 360 std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets(
336 in_out, clock_.TimeInMilliseconds() + time_ms, *flow_ids().begin()); 361 in_out, clock_.TimeInMilliseconds() + time_ms, *flow_ids().begin());
337 // The number of packets which are sent in during time_ms depends on the 362 // The number of packets which are sent in during time_ms depends on the
338 // number of packets in_flight_ and the max number of packets in flight 363 // number of packets in_flight_ and the max number of packets in flight
339 // (cwnd_). Therefore SendPackets() isn't directly dependent on time_ms. 364 // (cwnd_). Therefore SendPackets() isn't directly dependent on time_ms.
340 for (FeedbackPacket* fb : feedbacks) { 365 for (FeedbackPacket* fb : feedbacks) {
341 clock_.AdvanceTimeMilliseconds(fb->send_time_ms() - 366 clock_.AdvanceTimeMilliseconds(fb->send_time_ms() -
342 clock_.TimeInMilliseconds()); 367 clock_.TimeInMilliseconds());
343 last_rtt_ms_ = fb->send_time_ms() - fb->latest_send_time_ms(); 368 last_rtt_ms_ = fb->send_time_ms() - fb->latest_send_time_ms();
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 } 444 }
420 445
421 Packets TcpSender::GeneratePackets(size_t num_packets) { 446 Packets TcpSender::GeneratePackets(size_t num_packets) {
422 Packets generated; 447 Packets generated;
423 448
424 UpdateSendBitrateEstimate(num_packets); 449 UpdateSendBitrateEstimate(num_packets);
425 450
426 for (size_t i = 0; i < num_packets; ++i) { 451 for (size_t i = 0; i < num_packets; ++i) {
427 if ((total_sent_bytes_ + kPacketSizeBytes) > send_limit_bytes_) { 452 if ((total_sent_bytes_ + kPacketSizeBytes) > send_limit_bytes_) {
428 if (running_) { 453 if (running_) {
429 running_ = false; 454 Pause();
430 } 455 }
431 break; 456 break;
432 } 457 }
433 generated.push_back( 458 generated.push_back(
434 new MediaPacket(*flow_ids().begin(), 1000 * clock_.TimeInMilliseconds(), 459 new MediaPacket(*flow_ids().begin(), 1000 * clock_.TimeInMilliseconds(),
435 kPacketSizeBytes, next_sequence_number_++)); 460 kPacketSizeBytes, next_sequence_number_++));
436 generated.back()->set_sender_timestamp_us( 461 generated.back()->set_sender_timestamp_us(
437 1000 * clock_.TimeInMilliseconds()); 462 1000 * clock_.TimeInMilliseconds());
438 463
439 total_sent_bytes_ += kPacketSizeBytes; 464 total_sent_bytes_ += kPacketSizeBytes;
440 } 465 }
441 466
442 return generated; 467 return generated;
443 } 468 }
444 469
445 void TcpSender::UpdateSendBitrateEstimate(size_t num_packets) { 470 void TcpSender::UpdateSendBitrateEstimate(size_t num_packets) {
446 const int kTimeWindowMs = 500; 471 const int kTimeWindowMs = 500;
447 num_recent_sent_packets_ += num_packets; 472 num_recent_sent_packets_ += num_packets;
448 473
449 int64_t delta_ms = clock_.TimeInMilliseconds() - last_generated_packets_ms_; 474 int64_t delta_ms = clock_.TimeInMilliseconds() - last_generated_packets_ms_;
450 if (delta_ms >= kTimeWindowMs) { 475 if (delta_ms >= kTimeWindowMs) {
451 bitrate_kbps_ = 476 bitrate_kbps_ =
452 static_cast<uint32_t>(8 * num_recent_sent_packets_ * kPacketSizeBytes) / 477 static_cast<uint32_t>(8 * num_recent_sent_packets_ * kPacketSizeBytes) /
453 delta_ms; 478 delta_ms;
454 last_generated_packets_ms_ = clock_.TimeInMilliseconds(); 479 last_generated_packets_ms_ = clock_.TimeInMilliseconds();
455 num_recent_sent_packets_ = 0; 480 num_recent_sent_packets_ = 0;
456 } 481 }
482
483 RecordBitrate();
457 } 484 }
458 485
459 uint32_t TcpSender::TargetBitrateKbps() { 486 uint32_t TcpSender::TargetBitrateKbps() {
460 return bitrate_kbps_; 487 return bitrate_kbps_;
461 } 488 }
462 489
463 } // namespace bwe 490 } // namespace bwe
464 } // namespace testing 491 } // namespace testing
465 } // namespace webrtc 492 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698