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/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 Loading... | |
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 |
OLD | NEW |