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/modules/include/module_common_types.h" | 17 #include "webrtc/modules/include/module_common_types.h" |
| 18 #include "webrtc/modules/pacing/pacer.h" |
| 19 #include "webrtc/modules/remote_bitrate_estimator/test/bbr_paced_sender.h" |
18 #include "webrtc/modules/remote_bitrate_estimator/test/bwe.h" | 20 #include "webrtc/modules/remote_bitrate_estimator/test/bwe.h" |
19 #include "webrtc/modules/remote_bitrate_estimator/test/metric_recorder.h" | 21 #include "webrtc/modules/remote_bitrate_estimator/test/metric_recorder.h" |
20 #include "webrtc/rtc_base/checks.h" | 22 #include "webrtc/rtc_base/checks.h" |
21 | 23 |
22 namespace webrtc { | 24 namespace webrtc { |
23 namespace testing { | 25 namespace testing { |
24 namespace bwe { | 26 namespace bwe { |
25 | 27 |
26 void PacketSender::Pause() { | 28 void PacketSender::Pause() { |
27 running_ = false; | 29 running_ = false; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 RecordBitrate(); | 151 RecordBitrate(); |
150 } | 152 } |
151 | 153 |
152 uint32_t VideoSender::TargetBitrateKbps() { | 154 uint32_t VideoSender::TargetBitrateKbps() { |
153 return (source_->bits_per_second() + 500) / 1000; | 155 return (source_->bits_per_second() + 500) / 1000; |
154 } | 156 } |
155 | 157 |
156 PacedVideoSender::PacedVideoSender(PacketProcessorListener* listener, | 158 PacedVideoSender::PacedVideoSender(PacketProcessorListener* listener, |
157 VideoSource* source, | 159 VideoSource* source, |
158 BandwidthEstimatorType estimator) | 160 BandwidthEstimatorType estimator) |
159 : VideoSender(listener, source, estimator), pacer_(&clock_, this, nullptr) { | 161 : VideoSender(listener, source, estimator), |
160 modules_.push_back(&pacer_); | 162 // Ugly hack to use BBR's pacer. |
161 pacer_.SetEstimatedBitrate(source->bits_per_second()); | 163 // TODO(gnish): Make pacer choice dependant on the algorithm being used. |
| 164 pacer_(new BbrPacedSender(&clock_, this, nullptr)) { |
| 165 modules_.push_back(pacer_.get()); |
| 166 pacer_->SetEstimatedBitrate(source->bits_per_second()); |
162 } | 167 } |
163 | 168 |
164 PacedVideoSender::~PacedVideoSender() { | 169 PacedVideoSender::~PacedVideoSender() { |
165 for (Packet* packet : pacer_queue_) | 170 for (Packet* packet : pacer_queue_) |
166 delete packet; | 171 delete packet; |
167 for (Packet* packet : queue_) | 172 for (Packet* packet : queue_) |
168 delete packet; | 173 delete packet; |
169 } | 174 } |
170 | 175 |
171 void PacedVideoSender::RunFor(int64_t time_ms, Packets* in_out) { | 176 void PacedVideoSender::RunFor(int64_t time_ms, Packets* in_out) { |
(...skipping 25 matching lines...) Expand all Loading... |
197 // happens if the prober wants to probe, but there's no packet to send. | 202 // happens if the prober wants to probe, but there's no packet to send. |
198 if (time_until_next_event_ms == 0 && last_run_time_ms == 0) | 203 if (time_until_next_event_ms == 0 && last_run_time_ms == 0) |
199 time_until_next_event_ms = 1; | 204 time_until_next_event_ms = 1; |
200 last_run_time_ms = time_until_next_event_ms; | 205 last_run_time_ms = time_until_next_event_ms; |
201 | 206 |
202 Packets generated_packets; | 207 Packets generated_packets; |
203 source_->RunFor(time_until_next_event_ms, &generated_packets); | 208 source_->RunFor(time_until_next_event_ms, &generated_packets); |
204 if (!generated_packets.empty()) { | 209 if (!generated_packets.empty()) { |
205 for (Packet* packet : generated_packets) { | 210 for (Packet* packet : generated_packets) { |
206 MediaPacket* media_packet = static_cast<MediaPacket*>(packet); | 211 MediaPacket* media_packet = static_cast<MediaPacket*>(packet); |
207 pacer_.InsertPacket( | 212 pacer_->InsertPacket( |
208 PacedSender::kNormalPriority, media_packet->header().ssrc, | 213 PacedSender::kNormalPriority, media_packet->header().ssrc, |
209 media_packet->header().sequenceNumber, media_packet->send_time_ms(), | 214 media_packet->header().sequenceNumber, media_packet->send_time_ms(), |
210 media_packet->payload_size(), false); | 215 media_packet->payload_size(), false); |
| 216 pacer_queue_size_in_bytes_ += media_packet->payload_size(); |
211 pacer_queue_.push_back(packet); | 217 pacer_queue_.push_back(packet); |
212 assert(pacer_queue_.size() < 10000); | 218 assert(pacer_queue_.size() < 10000); |
213 } | 219 } |
214 } | 220 } |
215 | 221 |
216 clock_.AdvanceTimeMilliseconds(time_until_next_event_ms); | 222 clock_.AdvanceTimeMilliseconds(time_until_next_event_ms); |
217 | 223 |
218 if (time_until_next_event_ms == time_until_feedback_ms) { | 224 if (time_until_next_event_ms == time_until_feedback_ms) { |
219 if (!feedbacks.empty()) { | 225 if (!feedbacks.empty()) { |
220 bwe_->GiveFeedback(*feedbacks.front()); | 226 bwe_->GiveFeedback(*feedbacks.front()); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 const PacedPacketInfo& pacing_info) { | 283 const PacedPacketInfo& pacing_info) { |
278 for (Packets::iterator it = pacer_queue_.begin(); it != pacer_queue_.end(); | 284 for (Packets::iterator it = pacer_queue_.begin(); it != pacer_queue_.end(); |
279 ++it) { | 285 ++it) { |
280 MediaPacket* media_packet = static_cast<MediaPacket*>(*it); | 286 MediaPacket* media_packet = static_cast<MediaPacket*>(*it); |
281 if (media_packet->header().sequenceNumber == sequence_number) { | 287 if (media_packet->header().sequenceNumber == sequence_number) { |
282 int64_t pace_out_time_ms = clock_.TimeInMilliseconds(); | 288 int64_t pace_out_time_ms = clock_.TimeInMilliseconds(); |
283 | 289 |
284 // Make sure a packet is never paced out earlier than when it was put into | 290 // Make sure a packet is never paced out earlier than when it was put into |
285 // the pacer. | 291 // the pacer. |
286 assert(pace_out_time_ms >= media_packet->send_time_ms()); | 292 assert(pace_out_time_ms >= media_packet->send_time_ms()); |
287 | |
288 media_packet->SetAbsSendTimeMs(pace_out_time_ms); | 293 media_packet->SetAbsSendTimeMs(pace_out_time_ms); |
289 media_packet->set_send_time_us(1000 * pace_out_time_ms); | 294 media_packet->set_send_time_us(1000 * pace_out_time_ms); |
290 media_packet->set_sender_timestamp_us(1000 * pace_out_time_ms); | 295 media_packet->set_sender_timestamp_us(1000 * pace_out_time_ms); |
291 queue_.push_back(media_packet); | 296 queue_.push_back(media_packet); |
| 297 pacer_queue_size_in_bytes_ -= media_packet->payload_size(); |
292 pacer_queue_.erase(it); | 298 pacer_queue_.erase(it); |
293 return true; | 299 return true; |
294 } | 300 } |
295 } | 301 } |
296 return false; | 302 return false; |
297 } | 303 } |
298 | 304 |
299 size_t PacedVideoSender::TimeToSendPadding(size_t bytes, | 305 size_t PacedVideoSender::TimeToSendPadding(size_t bytes, |
300 const PacedPacketInfo& pacing_info) { | 306 const PacedPacketInfo& pacing_info) { |
301 return 0; | 307 return 0; |
302 } | 308 } |
303 | 309 |
304 void PacedVideoSender::OnNetworkChanged(uint32_t target_bitrate_bps, | 310 void PacedVideoSender::OnNetworkChanged(uint32_t target_bitrate_bps, |
305 uint8_t fraction_lost, | 311 uint8_t fraction_lost, |
306 int64_t rtt) { | 312 int64_t rtt) { |
307 VideoSender::OnNetworkChanged(target_bitrate_bps, fraction_lost, rtt); | 313 VideoSender::OnNetworkChanged(target_bitrate_bps, fraction_lost, rtt); |
308 pacer_.SetEstimatedBitrate(target_bitrate_bps); | 314 pacer_->SetEstimatedBitrate(target_bitrate_bps); |
| 315 } |
| 316 |
| 317 void PacedVideoSender::OnNetworkChanged(uint32_t bitrate_for_encoder_bps, |
| 318 uint32_t bitrate_for_pacer_bps, |
| 319 bool in_probe_rtt, |
| 320 int64_t target_set_time, |
| 321 uint64_t congestion_window) { |
| 322 VideoSender::OnNetworkChanged(bitrate_for_encoder_bps, 0u, 0u); |
| 323 pacer_->SetEstimatedBitrateAndCongestionWindow( |
| 324 bitrate_for_pacer_bps, in_probe_rtt, congestion_window); |
| 325 } |
| 326 |
| 327 void PacedVideoSender::OnBytesAcked(size_t bytes) { |
| 328 pacer_->OnBytesAcked(bytes); |
309 } | 329 } |
310 | 330 |
311 const int kNoLimit = std::numeric_limits<int>::max(); | 331 const int kNoLimit = std::numeric_limits<int>::max(); |
312 const int kPacketSizeBytes = 1200; | 332 const int kPacketSizeBytes = 1200; |
313 | 333 |
314 TcpSender::TcpSender(PacketProcessorListener* listener, | 334 TcpSender::TcpSender(PacketProcessorListener* listener, |
315 int flow_id, | 335 int flow_id, |
316 int64_t offset_ms) | 336 int64_t offset_ms) |
317 : TcpSender(listener, flow_id, offset_ms, kNoLimit) { | 337 : TcpSender(listener, flow_id, offset_ms, kNoLimit) { |
318 } | 338 } |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 RecordBitrate(); | 498 RecordBitrate(); |
479 } | 499 } |
480 | 500 |
481 uint32_t TcpSender::TargetBitrateKbps() { | 501 uint32_t TcpSender::TargetBitrateKbps() { |
482 return bitrate_kbps_; | 502 return bitrate_kbps_; |
483 } | 503 } |
484 | 504 |
485 } // namespace bwe | 505 } // namespace bwe |
486 } // namespace testing | 506 } // namespace testing |
487 } // namespace webrtc | 507 } // namespace webrtc |
OLD | NEW |