OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |