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