Chromium Code Reviews| Index: webrtc/modules/congestion_controller/send_side_congestion_controller.cc |
| diff --git a/webrtc/modules/congestion_controller/send_side_congestion_controller.cc b/webrtc/modules/congestion_controller/send_side_congestion_controller.cc |
| index 354ccaaaa58e67052d79c9b34992c62fe6610fef..4119690f1c5adbc0d2e07bfaab167dcafb84ba60 100644 |
| --- a/webrtc/modules/congestion_controller/send_side_congestion_controller.cc |
| +++ b/webrtc/modules/congestion_controller/send_side_congestion_controller.cc |
| @@ -16,9 +16,11 @@ |
| #include "webrtc/base/checks.h" |
| #include "webrtc/base/logging.h" |
| +#include "webrtc/base/ptr_util.h" |
| #include "webrtc/base/rate_limiter.h" |
| #include "webrtc/base/socket.h" |
| #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
| +#include "webrtc/modules/congestion_controller/acknowledge_bitrate_estimator.h" |
| #include "webrtc/modules/congestion_controller/probe_controller.h" |
| #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h" |
| @@ -42,6 +44,36 @@ static void ClampBitrates(int* bitrate_bps, |
| *bitrate_bps = std::max(*min_bitrate_bps, *bitrate_bps); |
| } |
| +class PacketFeedbackComparator { |
| + public: |
| + inline bool operator()(const webrtc::PacketFeedback& lhs, |
| + const webrtc::PacketFeedback& rhs) { |
| + if (lhs.arrival_time_ms != rhs.arrival_time_ms) |
| + return lhs.arrival_time_ms < rhs.arrival_time_ms; |
| + if (lhs.send_time_ms != rhs.send_time_ms) |
| + return lhs.send_time_ms < rhs.send_time_ms; |
| + return lhs.sequence_number < rhs.sequence_number; |
| + } |
| +}; |
| + |
| +std::vector<webrtc::PacketFeedback> ReceivedPacketFeedbackVector( |
| + const std::vector<webrtc::PacketFeedback>& input) { |
| + std::vector<PacketFeedback> sorted_packet_feedback_vector; |
| + auto is_received = [](const webrtc::PacketFeedback& packet_feedback) { |
| + return packet_feedback.arrival_time_ms != |
|
philipel
2017/06/02 12:32:40
How do we get feedback that does not have the arri
tschumi
2017/06/02 13:13:05
If the packet was not lost, we would receive this.
|
| + webrtc::PacketFeedback::kNotReceived; |
| + }; |
| + std::copy_if(input.begin(), input.end(), |
| + std::back_inserter(sorted_packet_feedback_vector), is_received); |
| + return sorted_packet_feedback_vector; |
| +} |
| + |
| +void SortPacketFeedbackVector( |
| + std::vector<webrtc::PacketFeedback>* const input) { |
| + RTC_DCHECK(input); |
| + std::sort(input->begin(), input->end(), PacketFeedbackComparator()); |
| +} |
| + |
| } // namespace |
| SendSideCongestionController::SendSideCongestionController( |
| @@ -67,6 +99,8 @@ SendSideCongestionController::SendSideCongestionController( |
| pacer_(std::move(pacer)), |
| bitrate_controller_( |
| BitrateController::CreateBitrateController(clock_, event_log)), |
| + acknowledged_bitrate_estimator_( |
| + rtc::MakeUnique<AcknowledgedBitrateEstimator>()), |
| probe_controller_(new ProbeController(pacer_.get(), clock_)), |
| retransmission_rate_limiter_( |
| new RateLimiter(clock, kRetransmitWindowSizeMs)), |
| @@ -251,12 +285,16 @@ void SendSideCongestionController::OnTransportFeedback( |
| const rtcp::TransportFeedback& feedback) { |
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| transport_feedback_adapter_.OnTransportFeedback(feedback); |
| - std::vector<PacketFeedback> feedback_vector = |
| - transport_feedback_adapter_.GetTransportFeedbackVector(); |
| + std::vector<PacketFeedback> feedback_vector = ReceivedPacketFeedbackVector( |
| + transport_feedback_adapter_.GetTransportFeedbackVector()); |
| + SortPacketFeedbackVector(&feedback_vector); |
| + acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector( |
| + feedback_vector); |
| DelayBasedBwe::Result result; |
| { |
| rtc::CritScope cs(&bwe_lock_); |
| - result = delay_based_bwe_->IncomingPacketFeedbackVector(feedback_vector); |
| + result = delay_based_bwe_->IncomingPacketFeedbackVector( |
| + feedback_vector, acknowledged_bitrate_estimator_->bitrate_bps()); |
| } |
| if (result.updated) |
| bitrate_controller_->OnDelayBasedBweResult(result); |