| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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/test/fake_network_pipe.h" | 11 #include "webrtc/test/fake_network_pipe.h" |
| 12 | 12 |
| 13 #include <assert.h> | 13 #include <assert.h> |
| 14 #include <math.h> | 14 #include <math.h> |
| 15 #include <string.h> | 15 #include <string.h> |
| 16 #include <algorithm> | 16 #include <algorithm> |
| 17 | 17 |
| 18 #include "webrtc/call.h" | 18 #include "webrtc/call.h" |
| 19 #include "webrtc/system_wrappers/include/tick_util.h" | 19 #include "webrtc/system_wrappers/include/clock.h" |
| 20 | 20 |
| 21 namespace webrtc { | 21 namespace webrtc { |
| 22 | 22 |
| 23 const double kPi = 3.14159265; | 23 const double kPi = 3.14159265; |
| 24 | 24 |
| 25 static int GaussianRandom(int mean_delay_ms, int standard_deviation_ms) { | 25 static int GaussianRandom(int mean_delay_ms, int standard_deviation_ms) { |
| 26 // Creating a Normal distribution variable from two independent uniform | 26 // Creating a Normal distribution variable from two independent uniform |
| 27 // variables based on the Box-Muller transform. | 27 // variables based on the Box-Muller transform. |
| 28 double uniform1 = (rand() + 1.0) / (RAND_MAX + 1.0); // NOLINT | 28 double uniform1 = (rand() + 1.0) / (RAND_MAX + 1.0); // NOLINT |
| 29 double uniform2 = (rand() + 1.0) / (RAND_MAX + 1.0); // NOLINT | 29 double uniform2 = (rand() + 1.0) / (RAND_MAX + 1.0); // NOLINT |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 // The packet data. | 63 // The packet data. |
| 64 uint8_t* data_; | 64 uint8_t* data_; |
| 65 // Length of data_. | 65 // Length of data_. |
| 66 size_t data_length_; | 66 size_t data_length_; |
| 67 // The time the packet was sent out on the network. | 67 // The time the packet was sent out on the network. |
| 68 const int64_t send_time_; | 68 const int64_t send_time_; |
| 69 // The time the packet should arrive at the reciver. | 69 // The time the packet should arrive at the reciver. |
| 70 int64_t arrival_time_; | 70 int64_t arrival_time_; |
| 71 }; | 71 }; |
| 72 | 72 |
| 73 FakeNetworkPipe::FakeNetworkPipe(const FakeNetworkPipe::Config& config) | 73 FakeNetworkPipe::FakeNetworkPipe(Clock* clock, |
| 74 : packet_receiver_(NULL), | 74 const FakeNetworkPipe::Config& config) |
| 75 : clock_(clock), |
| 76 packet_receiver_(NULL), |
| 75 config_(config), | 77 config_(config), |
| 76 dropped_packets_(0), | 78 dropped_packets_(0), |
| 77 sent_packets_(0), | 79 sent_packets_(0), |
| 78 total_packet_delay_(0), | 80 total_packet_delay_(0), |
| 79 next_process_time_(TickTime::MillisecondTimestamp()) { | 81 next_process_time_(clock_->TimeInMilliseconds()) {} |
| 80 } | |
| 81 | 82 |
| 82 FakeNetworkPipe::~FakeNetworkPipe() { | 83 FakeNetworkPipe::~FakeNetworkPipe() { |
| 83 while (!capacity_link_.empty()) { | 84 while (!capacity_link_.empty()) { |
| 84 delete capacity_link_.front(); | 85 delete capacity_link_.front(); |
| 85 capacity_link_.pop(); | 86 capacity_link_.pop(); |
| 86 } | 87 } |
| 87 while (!delay_link_.empty()) { | 88 while (!delay_link_.empty()) { |
| 88 delete delay_link_.front(); | 89 delete delay_link_.front(); |
| 89 delay_link_.pop(); | 90 delay_link_.pop(); |
| 90 } | 91 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 105 if (packet_receiver_ == NULL) | 106 if (packet_receiver_ == NULL) |
| 106 return; | 107 return; |
| 107 rtc::CritScope crit(&lock_); | 108 rtc::CritScope crit(&lock_); |
| 108 if (config_.queue_length_packets > 0 && | 109 if (config_.queue_length_packets > 0 && |
| 109 capacity_link_.size() >= config_.queue_length_packets) { | 110 capacity_link_.size() >= config_.queue_length_packets) { |
| 110 // Too many packet on the link, drop this one. | 111 // Too many packet on the link, drop this one. |
| 111 ++dropped_packets_; | 112 ++dropped_packets_; |
| 112 return; | 113 return; |
| 113 } | 114 } |
| 114 | 115 |
| 115 int64_t time_now = TickTime::MillisecondTimestamp(); | 116 int64_t time_now = clock_->TimeInMilliseconds(); |
| 116 | 117 |
| 117 // Delay introduced by the link capacity. | 118 // Delay introduced by the link capacity. |
| 118 int64_t capacity_delay_ms = 0; | 119 int64_t capacity_delay_ms = 0; |
| 119 if (config_.link_capacity_kbps > 0) | 120 if (config_.link_capacity_kbps > 0) |
| 120 capacity_delay_ms = data_length / (config_.link_capacity_kbps / 8); | 121 capacity_delay_ms = data_length / (config_.link_capacity_kbps / 8); |
| 121 int64_t network_start_time = time_now; | 122 int64_t network_start_time = time_now; |
| 122 | 123 |
| 123 // Check if there already are packets on the link and change network start | 124 // Check if there already are packets on the link and change network start |
| 124 // time if there is. | 125 // time if there is. |
| 125 if (capacity_link_.size() > 0) | 126 if (capacity_link_.size() > 0) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 142 | 143 |
| 143 int FakeNetworkPipe::AverageDelay() { | 144 int FakeNetworkPipe::AverageDelay() { |
| 144 rtc::CritScope crit(&lock_); | 145 rtc::CritScope crit(&lock_); |
| 145 if (sent_packets_ == 0) | 146 if (sent_packets_ == 0) |
| 146 return 0; | 147 return 0; |
| 147 | 148 |
| 148 return total_packet_delay_ / static_cast<int>(sent_packets_); | 149 return total_packet_delay_ / static_cast<int>(sent_packets_); |
| 149 } | 150 } |
| 150 | 151 |
| 151 void FakeNetworkPipe::Process() { | 152 void FakeNetworkPipe::Process() { |
| 152 int64_t time_now = TickTime::MillisecondTimestamp(); | 153 int64_t time_now = clock_->TimeInMilliseconds(); |
| 153 std::queue<NetworkPacket*> packets_to_deliver; | 154 std::queue<NetworkPacket*> packets_to_deliver; |
| 154 { | 155 { |
| 155 rtc::CritScope crit(&lock_); | 156 rtc::CritScope crit(&lock_); |
| 156 // Check the capacity link first. | 157 // Check the capacity link first. |
| 157 while (capacity_link_.size() > 0 && | 158 while (capacity_link_.size() > 0 && |
| 158 time_now >= capacity_link_.front()->arrival_time()) { | 159 time_now >= capacity_link_.front()->arrival_time()) { |
| 159 // Time to get this packet. | 160 // Time to get this packet. |
| 160 NetworkPacket* packet = capacity_link_.front(); | 161 NetworkPacket* packet = capacity_link_.front(); |
| 161 capacity_link_.pop(); | 162 capacity_link_.pop(); |
| 162 | 163 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 packet->data_length(), PacketTime()); | 204 packet->data_length(), PacketTime()); |
| 204 delete packet; | 205 delete packet; |
| 205 } | 206 } |
| 206 } | 207 } |
| 207 | 208 |
| 208 int64_t FakeNetworkPipe::TimeUntilNextProcess() const { | 209 int64_t FakeNetworkPipe::TimeUntilNextProcess() const { |
| 209 rtc::CritScope crit(&lock_); | 210 rtc::CritScope crit(&lock_); |
| 210 const int64_t kDefaultProcessIntervalMs = 30; | 211 const int64_t kDefaultProcessIntervalMs = 30; |
| 211 if (capacity_link_.size() == 0 || delay_link_.size() == 0) | 212 if (capacity_link_.size() == 0 || delay_link_.size() == 0) |
| 212 return kDefaultProcessIntervalMs; | 213 return kDefaultProcessIntervalMs; |
| 213 return std::max<int64_t>( | 214 return std::max<int64_t>(next_process_time_ - clock_->TimeInMilliseconds(), |
| 214 next_process_time_ - TickTime::MillisecondTimestamp(), 0); | 215 0); |
| 215 } | 216 } |
| 216 | 217 |
| 217 } // namespace webrtc | 218 } // namespace webrtc |
| OLD | NEW |