Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(345)

Side by Side Diff: webrtc/modules/congestion_controller/transport_feedback_adapter.cc

Issue 2918323002: Add functionality which limits the number of bytes on the network. (Closed)
Patch Set: Comments addressed. Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/congestion_controller/transport_feedback_adapter.h" 11 #include "webrtc/modules/congestion_controller/transport_feedback_adapter.h"
12 12
13 #include <algorithm>
14
13 #include "webrtc/modules/congestion_controller/delay_based_bwe.h" 15 #include "webrtc/modules/congestion_controller/delay_based_bwe.h"
14 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 16 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
15 #include "webrtc/rtc_base/checks.h" 17 #include "webrtc/rtc_base/checks.h"
16 #include "webrtc/rtc_base/logging.h" 18 #include "webrtc/rtc_base/logging.h"
17 #include "webrtc/rtc_base/mod_ops.h" 19 #include "webrtc/rtc_base/mod_ops.h"
18 #include "webrtc/system_wrappers/include/field_trial.h" 20 #include "webrtc/system_wrappers/include/field_trial.h"
19 21
20 namespace webrtc { 22 namespace webrtc {
21 23
22 const int64_t kNoTimestamp = -1; 24 const int64_t kNoTimestamp = -1;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 current_offset_ms_ += delta / 1000; 123 current_offset_ms_ += delta / 1000;
122 } 124 }
123 last_timestamp_us_ = timestamp_us; 125 last_timestamp_us_ = timestamp_us;
124 126
125 std::vector<PacketFeedback> packet_feedback_vector; 127 std::vector<PacketFeedback> packet_feedback_vector;
126 if (feedback.GetPacketStatusCount() == 0) { 128 if (feedback.GetPacketStatusCount() == 0) {
127 LOG(LS_INFO) << "Empty transport feedback packet received."; 129 LOG(LS_INFO) << "Empty transport feedback packet received.";
128 return packet_feedback_vector; 130 return packet_feedback_vector;
129 } 131 }
130 packet_feedback_vector.reserve(feedback.GetPacketStatusCount()); 132 packet_feedback_vector.reserve(feedback.GetPacketStatusCount());
131 133 int64_t feedback_rtt = -1;
132 { 134 {
133 rtc::CritScope cs(&lock_); 135 rtc::CritScope cs(&lock_);
134 size_t failed_lookups = 0; 136 size_t failed_lookups = 0;
135 int64_t offset_us = 0; 137 int64_t offset_us = 0;
136 int64_t timestamp_ms = 0; 138 int64_t timestamp_ms = 0;
137 uint16_t seq_num = feedback.GetBaseSequence(); 139 uint16_t seq_num = feedback.GetBaseSequence();
138 for (const auto& packet : feedback.GetReceivedPackets()) { 140 for (const auto& packet : feedback.GetReceivedPackets()) {
139 // Insert into the vector those unreceived packets which precede this 141 // Insert into the vector those unreceived packets which precede this
140 // iteration's received packet. 142 // iteration's received packet.
141 for (; seq_num != packet.sequence_number(); ++seq_num) { 143 for (; seq_num != packet.sequence_number(); ++seq_num) {
142 PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num); 144 PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num);
143 // Note: Element not removed from history because it might be reported 145 // Note: Element not removed from history because it might be reported
144 // as received by another feedback. 146 // as received by another feedback.
145 if (!send_time_history_.GetFeedback(&packet_feedback, false)) 147 if (!send_time_history_.GetFeedback(&packet_feedback, false))
146 ++failed_lookups; 148 ++failed_lookups;
147 if (packet_feedback.local_net_id == local_net_id_ && 149 if (packet_feedback.local_net_id == local_net_id_ &&
148 packet_feedback.remote_net_id == remote_net_id_) { 150 packet_feedback.remote_net_id == remote_net_id_) {
149 packet_feedback_vector.push_back(packet_feedback); 151 packet_feedback_vector.push_back(packet_feedback);
150 } 152 }
151 } 153 }
152 154
153 // Handle this iteration's received packet. 155 // Handle this iteration's received packet.
154 offset_us += packet.delta_us(); 156 offset_us += packet.delta_us();
155 timestamp_ms = current_offset_ms_ + (offset_us / 1000); 157 timestamp_ms = current_offset_ms_ + (offset_us / 1000);
156 PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number()); 158 PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number());
157 if (!send_time_history_.GetFeedback(&packet_feedback, true)) 159 if (!send_time_history_.GetFeedback(&packet_feedback, true))
158 ++failed_lookups; 160 ++failed_lookups;
159 if (packet_feedback.local_net_id == local_net_id_ && 161 if (packet_feedback.local_net_id == local_net_id_ &&
160 packet_feedback.remote_net_id == remote_net_id_) { 162 packet_feedback.remote_net_id == remote_net_id_) {
163 if (feedback_rtt == -1 && packet_feedback.send_time_ms >= 0) {
philipel 2017/08/04 14:13:04 Why don't we calculate the min rtt over all packet
stefan-webrtc 2017/08/07 07:37:11 Do you mean we should remove feedback_rtt == -1 fr
philipel 2017/08/07 11:39:48 Yes, but also calculating the RTT on the first pac
164 feedback_rtt =
165 clock_->TimeInMilliseconds() - packet_feedback.send_time_ms;
166 }
161 packet_feedback_vector.push_back(packet_feedback); 167 packet_feedback_vector.push_back(packet_feedback);
162 } 168 }
163 169
164 ++seq_num; 170 ++seq_num;
165 } 171 }
166 172
167 if (failed_lookups > 0) { 173 if (failed_lookups > 0) {
168 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups 174 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups
169 << " packet" << (failed_lookups > 1 ? "s" : "") 175 << " packet" << (failed_lookups > 1 ? "s" : "")
170 << ". Send time history too small?"; 176 << ". Send time history too small?";
171 } 177 }
178 if (feedback_rtt > -1) {
179 feedback_rtts_.push_back(feedback_rtt);
180 const size_t kFeedbackRttWindow = 32;
181 if (feedback_rtts_.size() > kFeedbackRttWindow)
182 feedback_rtts_.pop_front();
183 min_feedback_rtt_.emplace(
184 *std::min_element(feedback_rtts_.begin(), feedback_rtts_.end()));
185 }
172 } 186 }
173 return packet_feedback_vector; 187 return packet_feedback_vector;
174 } 188 }
175 189
176 void TransportFeedbackAdapter::OnTransportFeedback( 190 void TransportFeedbackAdapter::OnTransportFeedback(
177 const rtcp::TransportFeedback& feedback) { 191 const rtcp::TransportFeedback& feedback) {
178 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); 192 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback);
179 { 193 {
180 rtc::CritScope cs(&observers_lock_); 194 rtc::CritScope cs(&observers_lock_);
181 for (auto observer : observers_) { 195 for (auto observer : observers_) {
182 observer->OnPacketFeedbackVector(last_packet_feedback_vector_); 196 observer->OnPacketFeedbackVector(last_packet_feedback_vector_);
183 } 197 }
184 } 198 }
185 } 199 }
186 200
187 std::vector<PacketFeedback> 201 std::vector<PacketFeedback>
188 TransportFeedbackAdapter::GetTransportFeedbackVector() const { 202 TransportFeedbackAdapter::GetTransportFeedbackVector() const {
189 return last_packet_feedback_vector_; 203 return last_packet_feedback_vector_;
190 } 204 }
205
206 rtc::Optional<int64_t> TransportFeedbackAdapter::GetMinFeedbackLoopRtt() const {
207 rtc::CritScope cs(&lock_);
208 return min_feedback_rtt_;
209 }
210
211 size_t TransportFeedbackAdapter::GetOutstandingBytes() const {
212 rtc::CritScope cs(&lock_);
213 return send_time_history_.GetOutstandingBytes(local_net_id_, remote_net_id_);
214 }
191 } // namespace webrtc 215 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698