| 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 |